Updates

Update 2021.08.19

Pursuing Dim25 (85% of variance explained) res1 and res1.5 for biomark targets

Update 2021.08.11

Most thorough way to readdress differences between original and current analyses is to jsut redo the biomark. To that end, will restart analysis of just CMPm2, excluding other datasets (i.e., LSK, MEP, GMP). Will also keep

Notebook setup

Creating new pipeline using seurat v4.0.2 available 2021.06.08

Load libraries required for Seuratv4

Load libraries

library(dplyr)
library(Seurat)
library(patchwork)
library(ggplot2)
library(clustree)

Set global variables

projectName <- "CMP"
jackstraw.dim <- 40

Store session info

sessionInfo.filename <- paste0(projectName, "_sessionInfo.txt")
sink(sessionInfo.filename)
sessionInfo()
sink()

Load local scripts

source("../RFunctions/read_10XGenomics_data.R")
source("../RFunctions/PercentVariance.R")
source("../RFunctions/Mouse2Human_idconversion.R")
source ("../RFunctions/ColorPalette.R")

Read CMPm2

setwd("../../cellRanger/") # temporarily changing wd only works if you run the entire chunk at once
data_file.list <- read_10XGenomics_data(sample.list = "CMPm2")
object.data <-Read10X(data_file.list)
cmp.object<- CreateSeuratObject(counts = object.data, min.cells = 3, min.genes = 200, project = projectName)

Clean up to free memory

remove(object.data)

Add mitochondrial metadata and plot some basic features

cmp.object[["percent.mt"]] <- PercentageFeatureSet(cmp.object, pattern = "^mt-")
VlnPlot(cmp.object, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3, pt.size = 0, fill.by = 'orig.ident', )

plot1 <- FeatureScatter(cmp.object, feature1 = "nCount_RNA", feature2 = "percent.mt", group.by = "orig.ident", pt.size = 0.01)
plot2 <- FeatureScatter(cmp.object, feature1 = "nCount_RNA", feature2 = "nFeature_RNA", group.by = "orig.ident", pt.size = 0.01)
plot1 + plot2

Filter data

remove low quality cells require: nFeature_RNA between 200 and 4000 (inclusive) require: percent.mt <=5

print(paste("original object:", nrow(cmp.object@meta.data), "cells", sep = " "))
[1] "original object: 12540 cells"
cmp.object <- subset(cmp.object, 
                                                subset = nFeature_RNA >=200 & 
                                                    nFeature_RNA <= 4000 & 
                                                    percent.mt <= 5
                                                )
print(paste("new object:", nrow(cmp.object@meta.data), "cells", sep = " "))
[1] "new object: 12059 cells"
cmp.object <- NormalizeData(cmp.object, normalization.method = "LogNormalize", scale.factor = 10000)
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

Find variable features

cmp.object <- FindVariableFeatures(cmp.object, selection.method = "vst", nfeatures = 2000)
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
top10 <- head(VariableFeatures(cmp.object), 10)
plot1 <- VariableFeaturePlot(cmp.object)
plot2 <- LabelPoints(plot = plot1, points = top10, repel = TRUE)
When using repel, set xnudge and ynudge to 0 for optimal results
plot1 + plot2

Scale data (linear transformation)

We don’t have to worry about comparing library depths, so we’ll just do normalization/Scale data

Regressing out nFeature_RNA, nCount_RNA

  |                                                                                                                                                                                                                      
  |                                                                                                                                                                                                                |   0%
  |                                                                                                                                                                                                                      
  |=                                                                                                                                                                                                               |   0%
  |                                                                                                                                                                                                                      
  |=                                                                                                                                                                                                               |   1%
  |                                                                                                                                                                                                                      
  |==                                                                                                                                                                                                              |   1%
  |                                                                                                                                                                                                                      
  |===                                                                                                                                                                                                             |   1%
  |                                                                                                                                                                                                                      
  |===                                                                                                                                                                                                             |   2%
  |                                                                                                                                                                                                                      
  |====                                                                                                                                                                                                            |   2%
  |                                                                                                                                                                                                                      
  |=====                                                                                                                                                                                                           |   2%
  |                                                                                                                                                                                                                      
  |=====                                                                                                                                                                                                           |   3%
  |                                                                                                                                                                                                                      
  |======                                                                                                                                                                                                          |   3%
  |                                                                                                                                                                                                                      
  |=======                                                                                                                                                                                                         |   3%
  |                                                                                                                                                                                                                      
  |=======                                                                                                                                                                                                         |   4%
  |                                                                                                                                                                                                                      
  |========                                                                                                                                                                                                        |   4%
  |                                                                                                                                                                                                                      
  |=========                                                                                                                                                                                                       |   4%
  |                                                                                                                                                                                                                      
  |=========                                                                                                                                                                                                       |   5%
  |                                                                                                                                                                                                                      
  |==========                                                                                                                                                                                                      |   5%
  |                                                                                                                                                                                                                      
  |===========                                                                                                                                                                                                     |   5%
  |                                                                                                                                                                                                                      
  |===========                                                                                                                                                                                                     |   6%
  |                                                                                                                                                                                                                      
  |============                                                                                                                                                                                                    |   6%
  |                                                                                                                                                                                                                      
  |=============                                                                                                                                                                                                   |   6%
  |                                                                                                                                                                                                                      
  |==============                                                                                                                                                                                                  |   6%
  |                                                                                                                                                                                                                      
  |==============                                                                                                                                                                                                  |   7%
  |                                                                                                                                                                                                                      
  |===============                                                                                                                                                                                                 |   7%
  |                                                                                                                                                                                                                      
  |================                                                                                                                                                                                                |   7%
  |                                                                                                                                                                                                                      
  |================                                                                                                                                                                                                |   8%
  |                                                                                                                                                                                                                      
  |=================                                                                                                                                                                                               |   8%
  |                                                                                                                                                                                                                      
  |==================                                                                                                                                                                                              |   8%
  |                                                                                                                                                                                                                      
  |==================                                                                                                                                                                                              |   9%
  |                                                                                                                                                                                                                      
  |===================                                                                                                                                                                                             |   9%
  |                                                                                                                                                                                                                      
  |====================                                                                                                                                                                                            |   9%
  |                                                                                                                                                                                                                      
  |====================                                                                                                                                                                                            |  10%
  |                                                                                                                                                                                                                      
  |=====================                                                                                                                                                                                           |  10%
  |                                                                                                                                                                                                                      
  |======================                                                                                                                                                                                          |  10%
  |                                                                                                                                                                                                                      
  |======================                                                                                                                                                                                          |  11%
  |                                                                                                                                                                                                                      
  |=======================                                                                                                                                                                                         |  11%
  |                                                                                                                                                                                                                      
  |========================                                                                                                                                                                                        |  11%
  |                                                                                                                                                                                                                      
  |========================                                                                                                                                                                                        |  12%
  |                                                                                                                                                                                                                      
  |=========================                                                                                                                                                                                       |  12%
  |                                                                                                                                                                                                                      
  |==========================                                                                                                                                                                                      |  12%
  |                                                                                                                                                                                                                      
  |==========================                                                                                                                                                                                      |  13%
  |                                                                                                                                                                                                                      
  |===========================                                                                                                                                                                                     |  13%
  |                                                                                                                                                                                                                      
  |============================                                                                                                                                                                                    |  13%
  |                                                                                                                                                                                                                      
  |============================                                                                                                                                                                                    |  14%
  |                                                                                                                                                                                                                      
  |=============================                                                                                                                                                                                   |  14%
  |                                                                                                                                                                                                                      
  |==============================                                                                                                                                                                                  |  14%
  |                                                                                                                                                                                                                      
  |==============================                                                                                                                                                                                  |  15%
  |                                                                                                                                                                                                                      
  |===============================                                                                                                                                                                                 |  15%
  |                                                                                                                                                                                                                      
  |================================                                                                                                                                                                                |  15%
  |                                                                                                                                                                                                                      
  |================================                                                                                                                                                                                |  16%
  |                                                                                                                                                                                                                      
  |=================================                                                                                                                                                                               |  16%
  |                                                                                                                                                                                                                      
  |==================================                                                                                                                                                                              |  16%
  |                                                                                                                                                                                                                      
  |==================================                                                                                                                                                                              |  17%
  |                                                                                                                                                                                                                      
  |===================================                                                                                                                                                                             |  17%
  |                                                                                                                                                                                                                      
  |====================================                                                                                                                                                                            |  17%
  |                                                                                                                                                                                                                      
  |====================================                                                                                                                                                                            |  18%
  |                                                                                                                                                                                                                      
  |=====================================                                                                                                                                                                           |  18%
  |                                                                                                                                                                                                                      
  |======================================                                                                                                                                                                          |  18%
  |                                                                                                                                                                                                                      
  |======================================                                                                                                                                                                          |  19%
  |                                                                                                                                                                                                                      
  |=======================================                                                                                                                                                                         |  19%
  |                                                                                                                                                                                                                      
  |========================================                                                                                                                                                                        |  19%
  |                                                                                                                                                                                                                      
  |=========================================                                                                                                                                                                       |  19%
  |                                                                                                                                                                                                                      
  |=========================================                                                                                                                                                                       |  20%
  |                                                                                                                                                                                                                      
  |==========================================                                                                                                                                                                      |  20%
  |                                                                                                                                                                                                                      
  |===========================================                                                                                                                                                                     |  20%
  |                                                                                                                                                                                                                      
  |===========================================                                                                                                                                                                     |  21%
  |                                                                                                                                                                                                                      
  |============================================                                                                                                                                                                    |  21%
  |                                                                                                                                                                                                                      
  |=============================================                                                                                                                                                                   |  21%
  |                                                                                                                                                                                                                      
  |=============================================                                                                                                                                                                   |  22%
  |                                                                                                                                                                                                                      
  |==============================================                                                                                                                                                                  |  22%
  |                                                                                                                                                                                                                      
  |===============================================                                                                                                                                                                 |  22%
  |                                                                                                                                                                                                                      
  |===============================================                                                                                                                                                                 |  23%
  |                                                                                                                                                                                                                      
  |================================================                                                                                                                                                                |  23%
  |                                                                                                                                                                                                                      
  |=================================================                                                                                                                                                               |  23%
  |                                                                                                                                                                                                                      
  |=================================================                                                                                                                                                               |  24%
  |                                                                                                                                                                                                                      
  |==================================================                                                                                                                                                              |  24%
  |                                                                                                                                                                                                                      
  |===================================================                                                                                                                                                             |  24%
  |                                                                                                                                                                                                                      
  |===================================================                                                                                                                                                             |  25%
  |                                                                                                                                                                                                                      
  |====================================================                                                                                                                                                            |  25%
  |                                                                                                                                                                                                                      
  |=====================================================                                                                                                                                                           |  25%
  |                                                                                                                                                                                                                      
  |=====================================================                                                                                                                                                           |  26%
  |                                                                                                                                                                                                                      
  |======================================================                                                                                                                                                          |  26%
  |                                                                                                                                                                                                                      
  |=======================================================                                                                                                                                                         |  26%
  |                                                                                                                                                                                                                      
  |=======================================================                                                                                                                                                         |  27%
  |                                                                                                                                                                                                                      
  |========================================================                                                                                                                                                        |  27%
  |                                                                                                                                                                                                                      
  |=========================================================                                                                                                                                                       |  27%
  |                                                                                                                                                                                                                      
  |=========================================================                                                                                                                                                       |  28%
  |                                                                                                                                                                                                                      
  |==========================================================                                                                                                                                                      |  28%
  |                                                                                                                                                                                                                      
  |===========================================================                                                                                                                                                     |  28%
  |                                                                                                                                                                                                                      
  |===========================================================                                                                                                                                                     |  29%
  |                                                                                                                                                                                                                      
  |============================================================                                                                                                                                                    |  29%
  |                                                                                                                                                                                                                      
  |=============================================================                                                                                                                                                   |  29%
  |                                                                                                                                                                                                                      
  |=============================================================                                                                                                                                                   |  30%
  |                                                                                                                                                                                                                      
  |==============================================================                                                                                                                                                  |  30%
  |                                                                                                                                                                                                                      
  |===============================================================                                                                                                                                                 |  30%
  |                                                                                                                                                                                                                      
  |===============================================================                                                                                                                                                 |  31%
  |                                                                                                                                                                                                                      
  |================================================================                                                                                                                                                |  31%
  |                                                                                                                                                                                                                      
  |=================================================================                                                                                                                                               |  31%
  |                                                                                                                                                                                                                      
  |==================================================================                                                                                                                                              |  31%
  |                                                                                                                                                                                                                      
  |==================================================================                                                                                                                                              |  32%
  |                                                                                                                                                                                                                      
  |===================================================================                                                                                                                                             |  32%
  |                                                                                                                                                                                                                      
  |====================================================================                                                                                                                                            |  32%
  |                                                                                                                                                                                                                      
  |====================================================================                                                                                                                                            |  33%
  |                                                                                                                                                                                                                      
  |=====================================================================                                                                                                                                           |  33%
  |                                                                                                                                                                                                                      
  |======================================================================                                                                                                                                          |  33%
  |                                                                                                                                                                                                                      
  |======================================================================                                                                                                                                          |  34%
  |                                                                                                                                                                                                                      
  |=======================================================================                                                                                                                                         |  34%
  |                                                                                                                                                                                                                      
  |========================================================================                                                                                                                                        |  34%
  |                                                                                                                                                                                                                      
  |========================================================================                                                                                                                                        |  35%
  |                                                                                                                                                                                                                      
  |=========================================================================                                                                                                                                       |  35%
  |                                                                                                                                                                                                                      
  |==========================================================================                                                                                                                                      |  35%
  |                                                                                                                                                                                                                      
  |==========================================================================                                                                                                                                      |  36%
  |                                                                                                                                                                                                                      
  |===========================================================================                                                                                                                                     |  36%
  |                                                                                                                                                                                                                      
  |============================================================================                                                                                                                                    |  36%
  |                                                                                                                                                                                                                      
  |============================================================================                                                                                                                                    |  37%
  |                                                                                                                                                                                                                      
  |=============================================================================                                                                                                                                   |  37%
  |                                                                                                                                                                                                                      
  |==============================================================================                                                                                                                                  |  37%
  |                                                                                                                                                                                                                      
  |==============================================================================                                                                                                                                  |  38%
  |                                                                                                                                                                                                                      
  |===============================================================================                                                                                                                                 |  38%
  |                                                                                                                                                                                                                      
  |================================================================================                                                                                                                                |  38%
  |                                                                                                                                                                                                                      
  |================================================================================                                                                                                                                |  39%
  |                                                                                                                                                                                                                      
  |=================================================================================                                                                                                                               |  39%
  |                                                                                                                                                                                                                      
  |==================================================================================                                                                                                                              |  39%
  |                                                                                                                                                                                                                      
  |==================================================================================                                                                                                                              |  40%
  |                                                                                                                                                                                                                      
  |===================================================================================                                                                                                                             |  40%
  |                                                                                                                                                                                                                      
  |====================================================================================                                                                                                                            |  40%
  |                                                                                                                                                                                                                      
  |====================================================================================                                                                                                                            |  41%
  |                                                                                                                                                                                                                      
  |=====================================================================================                                                                                                                           |  41%
  |                                                                                                                                                                                                                      
  |======================================================================================                                                                                                                          |  41%
  |                                                                                                                                                                                                                      
  |======================================================================================                                                                                                                          |  42%
  |                                                                                                                                                                                                                      
  |=======================================================================================                                                                                                                         |  42%
  |                                                                                                                                                                                                                      
  |========================================================================================                                                                                                                        |  42%
  |                                                                                                                                                                                                                      
  |========================================================================================                                                                                                                        |  43%
  |                                                                                                                                                                                                                      
  |=========================================================================================                                                                                                                       |  43%
  |                                                                                                                                                                                                                      
  |==========================================================================================                                                                                                                      |  43%
  |                                                                                                                                                                                                                      
  |==========================================================================================                                                                                                                      |  44%
  |                                                                                                                                                                                                                      
  |===========================================================================================                                                                                                                     |  44%
  |                                                                                                                                                                                                                      
  |============================================================================================                                                                                                                    |  44%
  |                                                                                                                                                                                                                      
  |=============================================================================================                                                                                                                   |  44%
  |                                                                                                                                                                                                                      
  |=============================================================================================                                                                                                                   |  45%
  |                                                                                                                                                                                                                      
  |==============================================================================================                                                                                                                  |  45%
  |                                                                                                                                                                                                                      
  |===============================================================================================                                                                                                                 |  45%
  |                                                                                                                                                                                                                      
  |===============================================================================================                                                                                                                 |  46%
  |                                                                                                                                                                                                                      
  |================================================================================================                                                                                                                |  46%
  |                                                                                                                                                                                                                      
  |=================================================================================================                                                                                                               |  46%
  |                                                                                                                                                                                                                      
  |=================================================================================================                                                                                                               |  47%
  |                                                                                                                                                                                                                      
  |==================================================================================================                                                                                                              |  47%
  |                                                                                                                                                                                                                      
  |===================================================================================================                                                                                                             |  47%
  |                                                                                                                                                                                                                      
  |===================================================================================================                                                                                                             |  48%
  |                                                                                                                                                                                                                      
  |====================================================================================================                                                                                                            |  48%
  |                                                                                                                                                                                                                      
  |=====================================================================================================                                                                                                           |  48%
  |                                                                                                                                                                                                                      
  |=====================================================================================================                                                                                                           |  49%
  |                                                                                                                                                                                                                      
  |======================================================================================================                                                                                                          |  49%
  |                                                                                                                                                                                                                      
  |=======================================================================================================                                                                                                         |  49%
  |                                                                                                                                                                                                                      
  |=======================================================================================================                                                                                                         |  50%
  |                                                                                                                                                                                                                      
  |========================================================================================================                                                                                                        |  50%
  |                                                                                                                                                                                                                      
  |=========================================================================================================                                                                                                       |  50%
  |                                                                                                                                                                                                                      
  |=========================================================================================================                                                                                                       |  51%
  |                                                                                                                                                                                                                      
  |==========================================================================================================                                                                                                      |  51%
  |                                                                                                                                                                                                                      
  |===========================================================================================================                                                                                                     |  51%
  |                                                                                                                                                                                                                      
  |===========================================================================================================                                                                                                     |  52%
  |                                                                                                                                                                                                                      
  |============================================================================================================                                                                                                    |  52%
  |                                                                                                                                                                                                                      
  |=============================================================================================================                                                                                                   |  52%
  |                                                                                                                                                                                                                      
  |=============================================================================================================                                                                                                   |  53%
  |                                                                                                                                                                                                                      
  |==============================================================================================================                                                                                                  |  53%
  |                                                                                                                                                                                                                      
  |===============================================================================================================                                                                                                 |  53%
  |                                                                                                                                                                                                                      
  |===============================================================================================================                                                                                                 |  54%
  |                                                                                                                                                                                                                      
  |================================================================================================================                                                                                                |  54%
  |                                                                                                                                                                                                                      
  |=================================================================================================================                                                                                               |  54%
  |                                                                                                                                                                                                                      
  |=================================================================================================================                                                                                               |  55%
  |                                                                                                                                                                                                                      
  |==================================================================================================================                                                                                              |  55%
  |                                                                                                                                                                                                                      
  |===================================================================================================================                                                                                             |  55%
  |                                                                                                                                                                                                                      
  |===================================================================================================================                                                                                             |  56%
  |                                                                                                                                                                                                                      
  |====================================================================================================================                                                                                            |  56%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================                                                                                           |  56%
  |                                                                                                                                                                                                                      
  |======================================================================================================================                                                                                          |  56%
  |                                                                                                                                                                                                                      
  |======================================================================================================================                                                                                          |  57%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================                                                                                         |  57%
  |                                                                                                                                                                                                                      
  |========================================================================================================================                                                                                        |  57%
  |                                                                                                                                                                                                                      
  |========================================================================================================================                                                                                        |  58%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================                                                                                       |  58%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================                                                                                      |  58%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================                                                                                      |  59%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================                                                                                     |  59%
  |                                                                                                                                                                                                                      
  |============================================================================================================================                                                                                    |  59%
  |                                                                                                                                                                                                                      
  |============================================================================================================================                                                                                    |  60%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================                                                                                   |  60%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================                                                                                  |  60%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================                                                                                  |  61%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================                                                                                 |  61%
  |                                                                                                                                                                                                                      
  |================================================================================================================================                                                                                |  61%
  |                                                                                                                                                                                                                      
  |================================================================================================================================                                                                                |  62%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================                                                                               |  62%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================                                                                              |  62%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================                                                                              |  63%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================                                                                             |  63%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================                                                                            |  63%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================                                                                            |  64%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================                                                                           |  64%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================                                                                          |  64%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================                                                                          |  65%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================                                                                         |  65%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================                                                                        |  65%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================                                                                        |  66%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================                                                                       |  66%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================                                                                      |  66%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================                                                                      |  67%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================                                                                     |  67%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================                                                                    |  67%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================                                                                    |  68%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================                                                                   |  68%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================                                                                  |  68%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================                                                                  |  69%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================================                                                                 |  69%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================                                                                |  69%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================================                                                               |  69%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================================                                                               |  70%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================================                                                              |  70%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================                                                             |  70%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================                                                             |  71%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================================                                                            |  71%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================                                                           |  71%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================                                                           |  72%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================================                                                          |  72%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================                                                         |  72%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================                                                         |  73%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================================                                                        |  73%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================================                                                       |  73%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================================                                                       |  74%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================================                                                      |  74%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================                                                     |  74%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================                                                     |  75%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================================                                                    |  75%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================                                                   |  75%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================                                                   |  76%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================================                                                  |  76%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================================================                                                 |  76%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================================================                                                 |  77%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================                                                |  77%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================================================                                               |  77%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================================================                                               |  78%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================================================                                              |  78%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================================                                             |  78%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================================                                             |  79%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================================================                                            |  79%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================================                                           |  79%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================================                                           |  80%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================================================                                          |  80%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================================                                         |  80%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================================                                         |  81%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================================================                                        |  81%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================================================                                       |  81%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================================================                                      |  81%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================================================                                      |  82%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================================                                     |  82%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================================================                                    |  82%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================================================                                    |  83%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================================                                   |  83%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================================================                                  |  83%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================================================                                  |  84%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================================================================                                 |  84%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================================                                |  84%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================================                                |  85%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================================================================                               |  85%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================================================================                              |  85%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================================================================                              |  86%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================================================                             |  86%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================================================================                            |  86%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================================================================                            |  87%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================================================                           |  87%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================================================================                          |  87%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================================================================                          |  88%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================================================                         |  88%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================================================================                        |  88%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================================================================                        |  89%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================================================================                       |  89%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================================================================                      |  89%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================================================================                      |  90%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================================================                     |  90%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================================================================                    |  90%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================================================================                    |  91%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================================================                   |  91%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================================================================                  |  91%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================================================================                  |  92%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================================================================================                 |  92%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================================================                |  92%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================================================                |  93%
  |                                                                                                                                                                                                                      
  |=================================================================================================================================================================================================               |  93%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================================================================================              |  93%
  |                                                                                                                                                                                                                      
  |==================================================================================================================================================================================================              |  94%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================================================================             |  94%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================================================================================            |  94%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================================================================           |  94%
  |                                                                                                                                                                                                                      
  |=====================================================================================================================================================================================================           |  95%
  |                                                                                                                                                                                                                      
  |======================================================================================================================================================================================================          |  95%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================================================================         |  95%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================================================================================         |  96%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================================================================================        |  96%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================================================================================       |  96%
  |                                                                                                                                                                                                                      
  |=========================================================================================================================================================================================================       |  97%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================================================================================================      |  97%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================================================================     |  97%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================================================================     |  98%
  |                                                                                                                                                                                                                      
  |============================================================================================================================================================================================================    |  98%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================================================================   |  98%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================================================================   |  99%
  |                                                                                                                                                                                                                      
  |==============================================================================================================================================================================================================  |  99%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================================================================== |  99%
  |                                                                                                                                                                                                                      
  |=============================================================================================================================================================================================================== | 100%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================================================================| 100%
Centering and scaling data matrix

  |                                                                                                                                                                                                                      
  |                                                                                                                                                                                                                |   0%
  |                                                                                                                                                                                                                      
  |============                                                                                                                                                                                                    |   6%
  |                                                                                                                                                                                                                      
  |========================                                                                                                                                                                                        |  12%
  |                                                                                                                                                                                                                      
  |=====================================                                                                                                                                                                           |  18%
  |                                                                                                                                                                                                                      
  |=================================================                                                                                                                                                               |  24%
  |                                                                                                                                                                                                                      
  |=============================================================                                                                                                                                                   |  29%
  |                                                                                                                                                                                                                      
  |=========================================================================                                                                                                                                       |  35%
  |                                                                                                                                                                                                                      
  |======================================================================================                                                                                                                          |  41%
  |                                                                                                                                                                                                                      
  |==================================================================================================                                                                                                              |  47%
  |                                                                                                                                                                                                                      
  |==============================================================================================================                                                                                                  |  53%
  |                                                                                                                                                                                                                      
  |==========================================================================================================================                                                                                      |  59%
  |                                                                                                                                                                                                                      
  |=======================================================================================================================================                                                                         |  65%
  |                                                                                                                                                                                                                      
  |===================================================================================================================================================                                                             |  71%
  |                                                                                                                                                                                                                      
  |===============================================================================================================================================================                                                 |  76%
  |                                                                                                                                                                                                                      
  |===========================================================================================================================================================================                                     |  82%
  |                                                                                                                                                                                                                      
  |========================================================================================================================================================================================                        |  88%
  |                                                                                                                                                                                                                      
  |====================================================================================================================================================================================================            |  94%
  |                                                                                                                                                                                                                      
  |================================================================================================================================================================================================================| 100%

Save raw object

saveRDS(cmp.object, file = paste0(projectName, "_raw.RDS"))
cmp.object <- RunPCA(cmp.object, features = VariableFeatures(cmp.object), ndims.print = 1:5, nfeatures.print = 5)
PC_ 1 
Positive:  Vamp5, Nkg7, Car2, Apoe, Ctla2a 
Negative:  Lgals3, Aif1, Id2, Cst3, H2-Aa 
PC_ 2 
Positive:  Prtn3, Ctsg, H2afy, Mpo, Emb 
Negative:  Ube2c, Cenpf, Nusap1, Mki67, Cenpa 
PC_ 3 
Positive:  Pf4, Tmsb4x, Cavin2, Serpine2, Rap1b 
Negative:  Plac8, Cks2, Cenpa, Ube2c, Tubb4b 
PC_ 4 
Positive:  Csrp3, Car1, Jun, Apoe, Jund 
Negative:  H2afz, Hmgn2, Birc5, Hmgb1, Tuba1b 
PC_ 5 
Positive:  Pclaf, Tyms, Rrm2, Tk1, Pcna 
Negative:  Hist1h2bc, Tsc22d1, Smim14, Ccnb2, Serpinb1a 
DimPlot(cmp.object, reduction = "pca", group.by = "orig.ident")

VizDimLoadings(cmp.object, dims = 1:6, nfeatures = 10, reduction = "pca", ncol = 3)

Calculate dimensionality

ElbowPlot(cmp.object, ndims = 50)
percent.variance(cmp.object@reductions$pca@stdev)

Number of PCs describing X% of variance

ElbowPlot(cmp.object, ndims = 50)

percent.variance(cmp.object@reductions$pca@stdev)

Add cluster IDs from Seurat v1

Exported cell IDs for clusters 3, 17, 10, 11 from Seurat v1. Will add these IDs as a metadata column.
Create column “clust.ID” and populate with 0’s. Then import IDs for clusters

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
paste0("Num pcs for 80% variance:", length(which(cumsum(tot.var) <= 80)))
[1] "Num pcs for 80% variance:18"
paste0("Num pcs for 85% variance:", length(which(cumsum(tot.var) <= 85)))
[1] "Num pcs for 85% variance:25"
paste0("Num pcs for 90% variance:", length(which(cumsum(tot.var) <= 90)))
[1] "Num pcs for 90% variance:33"
paste0("Num pcs for 95% variance:", length(which(cumsum(tot.var) <= 95)))
[1] "Num pcs for 95% variance:41"

Add new metadata column

clust3.cells <- read.table(file = "../Seuratv1_clusterCellIDs/cluster3cellIDs.txt", col.names = "clust03")
clust3.cells <- sapply(clust3.cells, function(x) paste0(gsub("CMP", "CMPm2", x), "-1"))
clust17.cells <- read.table(file = "../Seuratv1_clusterCellIDs/cluster17cellIDs.txt", col.names = "clust17")
clust17.cells <- sapply(clust17.cells, function(x) paste0(gsub("CMP", "CMPm2", x), "-1"))
clust10.cells <- read.table(file = "../Seuratv1_clusterCellIDs/cluster10cellIDs.txt", col.names = "clust10")
clust10.cells <- sapply(clust10.cells, function(x) paste0(gsub("CMP", "CMPm2", x), "-1"))
clust11.cells <- read.table(file = "../Seuratv1_clusterCellIDs/cluster11cellIDs.txt", col.names = "clust11")
clust11.cells <- sapply(clust11.cells, function(x) paste0(gsub("CMP", "CMPm2", x), "-1"))

now map new ids

cmp.object@meta.data['clust.ID'] <- 0
head(cmp.object@meta.data)
Registered S3 method overwritten by 'cli':
  method     from         
  print.boxx spatstat.geom

do numbers make sense?

cmp.object@meta.data$clust.ID[rownames(cmp.object@meta.data) %in% clust3.cells] <- 3
cmp.object@meta.data$clust.ID[rownames(cmp.object@meta.data) %in% clust17.cells] <- 17
cmp.object@meta.data$clust.ID[rownames(cmp.object@meta.data) %in% clust10.cells] <- 10
cmp.object@meta.data$clust.ID[rownames(cmp.object@meta.data) %in% clust11.cells] <- 11

Total var 90%

Neighborhood and umap

set total.var <- 90%

nrow(cmp.object@meta.data[cmp.object@meta.data$clust.ID == 10,])
[1] 1049
nrow(cmp.object@meta.data[cmp.object@meta.data$clust.ID == 11,])
[1] 1118
nrow(cmp.object@meta.data[cmp.object@meta.data$clust.ID == 17,])
[1] 883
nrow(cmp.object@meta.data[cmp.object@meta.data$clust.ID == 3,])
[1] 1931

Plot UMAP

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
ndims <- length(which(cumsum(tot.var) <= 90))

cmp.object <- FindNeighbors(cmp.object, dims = 1:ndims)
Computing nearest neighbor graph
Computing SNN
cmp.object <- FindClusters(cmp.object, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 452999

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8502
Number of communities: 9
Elapsed time: 1 seconds
cmp.object <- RunUMAP(cmp.object, dims = 1: ndims)
14:08:12 UMAP embedding parameters a = 0.9922 b = 1.112
14:08:12 Read 12059 rows and found 33 numeric columns
14:08:12 Using Annoy for neighbor search, n_neighbors = 30
14:08:12 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
14:08:13 Writing NN index file to temp file /var/folders/4f/fwrj6fnn1dn4g8wsf0zv563hjsvl24/T//Rtmp5gGDJN/file582a2b2d9d6c
14:08:14 Searching Annoy index using 1 thread, search_k = 3000
14:08:16 Annoy recall = 100%
14:08:17 Commencing smooth kNN distance calibration using 1 thread
14:08:17 Initializing from normalized Laplacian + noise
14:08:18 Commencing optimization for 200 epochs, with 513294 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
14:08:23 Optimization finished
for(x in c(0.5, 1, 1.5, 2, 2.5)){
    cmp.object <- FindClusters(cmp.object, resolution = x)
}
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 452999

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8502
Number of communities: 9
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 452999

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7974
Number of communities: 17
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 452999

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7652
Number of communities: 22
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 452999

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7404
Number of communities: 27
Elapsed time: 1 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 452999

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7189
Number of communities: 30
Elapsed time: 1 seconds
saveRDS(cmp.object, file = paste0(projectName, "_dim", ndims, ".RDS"))

Clustree

what’s the max resolution we can achieve while keepign clusters stable?

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        myplot <- DimPlot(cmp.object, 
                                            group.by = meta.col,
                                            reduction = "umap", 
                                            cols = color.palette
                                            ) + 
            ggtitle(paste0(projectName, " dim", ndims, "res", gsub("RNA_snn_res", "", meta.col) ))
        plot(myplot)
    }
}

I think I’m liking res.1.0 from this. Although how much does this change if I use fewer PCs…

for each resolution, number/percentage of cells in each cluster?

plot.title <- paste0(projectName, "_clustree_ndim", max(cmp.object@commands$RunUMAP.RNA.pca$dims))
my.clustree <- clustree(cmp.object, prefix = "RNA_snn_res.", node_colour = "sc3_stability", exprs = "scale.data") + 
    scale_color_continuous(low = 'red3', high = 'white') + 
    ggtitle(plot.title)
png(filename = paste0(plot.title, ".png"), height = 800, width = 1600)
plot(my.clustree)
dev.off()
null device 
          1 

For each resolution, what percentage of cells in each cluster are enriched for one of our clust.IDs?

Test: what percentage of each new clusterID matches one of the older clusters?

tot.cells <- nrow(cmp.object@meta.data)
for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        new.clusters <- sort(as.numeric(levels(cmp.object@meta.data[[meta.col]])))
        stats.df <- data.frame(matrix(ncol = 2, nrow = length(new.clusters)))
        colnames(stats.df) <- c("num_cells", "pct_pop")
        rownames(stats.df) <- new.clusters
        meta.df <- cmp.object@meta.data
        for(row.id in rownames(stats.df)){
                num.x <- nrow(meta.df[meta.df[meta.col] == row.id,])
                pct.x <- as.integer(num.x / tot.cells *100)
                # print(pct.x)
                stats.df[row.id, "num_cells"] <- num.x
                stats.df[row.id, "pct_pop"] <- pct.x
        }
        print(stats.df)
    }
}

Absolutely terrible overlap, no enrichment of any of these across the new clustering algorithm. Maybe should try 95% variation covered

Find old cells on UMAP

time for the super scarey moment to see if the cells from seuratv1 still cluster together on in seurat v4

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        new.clusters <- sort(as.numeric(levels(cmp.object@meta.data[[meta.col]])))
        enrich.df <- data.frame(matrix(ncol = 4, nrow = length(new.clusters)))
        colnames(enrich.df) <- c(3, 17, 10, 11)
        rownames(enrich.df) <- new.clusters
        meta.df <- cmp.object@meta.data
        for(row.id in rownames(enrich.df)){
            tot.clus <- nrow(meta.df[meta.df[[meta.col]] == row.id,])
            for(col.id in colnames(enrich.df)){
                num.x <- nrow(meta.df[(meta.df[[meta.col]] == row.id) & (meta.df$clust.ID == col.id),])
                pct.x <- as.integer(num.x / tot.clus *100)
                # print(pct.x)
                enrich.df[row.id, col.id] <- pct.x
            }
        }
        colnames(enrich.df) <- sapply(colnames(enrich.df), function(x) paste0("oldcluster", x))
        rownames(enrich.df) <- sapply(rownames(enrich.df), function(x) paste0("newcluster", x))
        xlsx::write.xlsx(enrich.df, file = paste0("PctOfNewClustersOverlappingOldClusters_", projectName, "_dim", ndims, ".xlsx"), sheetName = paste0(gsub("RNA_snn_", "", meta.col)), append = TRUE)
        print(enrich.df)
    }
}
NA
DimPlot(cmp.object,
                reduction = "umap",
                group.by = "clust.ID", 
                # split.by = "orig.ident",
                cols = c("gray", "orange", "blue", "red", "green"),)

Total var 85%

Neighborhood and umap

set total.var <- 85%

DimPlot(cmp.object,
                reduction = "umap",
                group.by = "orig.ident", 
                split.by = "clust.ID",
                cols = c("gray", "orange", "blue", "red", "green"),)

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
ndims <- length(which(cumsum(tot.var) <= 85))

Plot UMAP

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
ndims <- length(which(cumsum(tot.var) <= 85))

cmp.object <- FindNeighbors(cmp.object, dims = 1:ndims)
Computing nearest neighbor graph
Computing SNN
cmp.object <- FindClusters(cmp.object, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 424091

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8508
Number of communities: 9
Elapsed time: 2 seconds
cmp.object <- RunUMAP(cmp.object, dims = 1: ndims)
Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
This message will be shown once per session
10:37:55 UMAP embedding parameters a = 0.9922 b = 1.112
10:37:55 Read 12059 rows and found 25 numeric columns
10:37:55 Using Annoy for neighbor search, n_neighbors = 30
10:37:55 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
10:37:57 Writing NN index file to temp file /var/folders/4f/fwrj6fnn1dn4g8wsf0zv563hjsvl24/T//RtmpjY0Xgs/file912c3cf1e81b
10:37:57 Searching Annoy index using 1 thread, search_k = 3000
10:38:01 Annoy recall = 100%
10:38:01 Commencing smooth kNN distance calibration using 1 thread
10:38:02 Initializing from normalized Laplacian + noise
10:38:02 Commencing optimization for 200 epochs, with 500658 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
for(x in c(0.5, 1, 1.5, 2, 2.5)){
    cmp.object <- FindClusters(cmp.object, resolution = x)
saveRDS(cmp.object, file = paste0(projectName, "_dim", ndims, ".RDS"))
}
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 424091

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8508
Number of communities: 9
Elapsed time: 3 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 424091

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8026
Number of communities: 18
Elapsed time: 2 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 424091

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7700
Number of communities: 22
Elapsed time: 2 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 424091

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7461
Number of communities: 28
Elapsed time: 2 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 12059
Number of edges: 424091

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7257
Number of communities: 33
Elapsed time: 1 seconds

Clustree

what’s the max resolution we can achieve while keepign clusters stable?

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        plot.title <- paste0(projectName, "dim", ndims, "res", gsub("RNA_snn_res", "", meta.col))
        myplot <- DimPlot(cmp.object, 
                                            group.by = meta.col,
                                            reduction = "umap", 
                                            cols = color.palette
                                            ) + 
            ggtitle(plot.title)
        plot(myplot)
        png(filename = paste0(plot.title, ".png"), height = 800, width = 800)
        plot(DimPlot(cmp.object, 
                                            group.by = meta.col,
                                            reduction = "umap", 
                                            cols = color.palette, 
                                            pt.size = 1.5
                                            ) + 
            ggtitle(plot.title)
            )
        dev.off()
    }
}

for each resolution, number/percentage of cells in each cluster?

plot.title <- paste0(projectName, "_clustree_ndim", max(cmp.object@commands$RunUMAP.RNA.pca$dims))
my.clustree <- clustree(cmp.object, prefix = "RNA_snn_res.", node_colour = "sc3_stability", exprs = "scale.data") + 
    scale_color_continuous(low = 'red3', high = 'white') + 
    ggtitle(plot.title)
plot(my.clustree)
png(filename = paste0(plot.title, ".png"), height = 800, width = 1600)
plot(my.clustree)
dev.off()
quartz_off_screen 
                2 

Identify variable genes for new biomark

tot.cells <- nrow(cmp.object@meta.data)
for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        new.clusters <- sort(as.numeric(levels(cmp.object@meta.data[[meta.col]])))
        stats.df <- data.frame(matrix(ncol = 2, nrow = length(new.clusters)))
        colnames(stats.df) <- c("num_cells", "pct_pop")
        rownames(stats.df) <- new.clusters
        meta.df <- cmp.object@meta.data
        for(row.id in rownames(stats.df)){
                num.x <- nrow(meta.df[meta.df[meta.col] == row.id,])
                pct.x <- as.integer(num.x / tot.cells *100)
                # print(pct.x)
                stats.df[row.id, "num_cells"] <- num.x
                stats.df[row.id, "pct_pop"] <- pct.x
        }
        print(stats.df)
    }
}

Gene profiles of clusters

set ident at res = 1 and get markers

Idents(cmp.object) <- "RNA_snn_res.1"
Idents(cmp.object) <- "RNA_snn_res.1"
cmp.allmarkers.res1 <- FindAllMarkers(cmp.object)
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~23s          
  |++                                                | 2 % ~23s          
  |++                                                | 3 % ~22s          
  |+++                                               | 4 % ~21s          
  |+++                                               | 5 % ~21s          
  |++++                                              | 6 % ~20s          
  |++++                                              | 7 % ~20s          
  |+++++                                             | 8 % ~20s          
  |+++++                                             | 9 % ~19s          
  |++++++                                            | 10% ~20s          
  |++++++                                            | 11% ~19s          
  |+++++++                                           | 12% ~19s          
  |+++++++                                           | 14% ~19s          
  |++++++++                                          | 15% ~19s          
  |++++++++                                          | 16% ~18s          
  |+++++++++                                         | 17% ~18s          
  |+++++++++                                         | 18% ~18s          
  |++++++++++                                        | 19% ~18s          
  |++++++++++                                        | 20% ~17s          
  |+++++++++++                                       | 21% ~17s          
  |+++++++++++                                       | 22% ~17s          
  |++++++++++++                                      | 23% ~17s          
  |++++++++++++                                      | 24% ~17s          
  |+++++++++++++                                     | 25% ~16s          
  |++++++++++++++                                    | 26% ~16s          
  |++++++++++++++                                    | 27% ~16s          
  |+++++++++++++++                                   | 28% ~16s          
  |+++++++++++++++                                   | 29% ~15s          
  |++++++++++++++++                                  | 30% ~15s          
  |++++++++++++++++                                  | 31% ~15s          
  |+++++++++++++++++                                 | 32% ~15s          
  |+++++++++++++++++                                 | 33% ~14s          
  |++++++++++++++++++                                | 34% ~14s          
  |++++++++++++++++++                                | 35% ~14s          
  |+++++++++++++++++++                               | 36% ~14s          
  |+++++++++++++++++++                               | 38% ~14s          
  |++++++++++++++++++++                              | 39% ~13s          
  |++++++++++++++++++++                              | 40% ~13s          
  |+++++++++++++++++++++                             | 41% ~13s          
  |+++++++++++++++++++++                             | 42% ~13s          
  |++++++++++++++++++++++                            | 43% ~13s          
  |++++++++++++++++++++++                            | 44% ~12s          
  |+++++++++++++++++++++++                           | 45% ~12s          
  |+++++++++++++++++++++++                           | 46% ~12s          
  |++++++++++++++++++++++++                          | 47% ~12s          
  |++++++++++++++++++++++++                          | 48% ~11s          
  |+++++++++++++++++++++++++                         | 49% ~11s          
  |+++++++++++++++++++++++++                         | 50% ~11s          
  |++++++++++++++++++++++++++                        | 51% ~11s          
  |+++++++++++++++++++++++++++                       | 52% ~10s          
  |+++++++++++++++++++++++++++                       | 53% ~10s          
  |++++++++++++++++++++++++++++                      | 54% ~10s          
  |++++++++++++++++++++++++++++                      | 55% ~10s          
  |+++++++++++++++++++++++++++++                     | 56% ~09s          
  |+++++++++++++++++++++++++++++                     | 57% ~09s          
  |++++++++++++++++++++++++++++++                    | 58% ~09s          
  |++++++++++++++++++++++++++++++                    | 59% ~09s          
  |+++++++++++++++++++++++++++++++                   | 60% ~09s          
  |+++++++++++++++++++++++++++++++                   | 61% ~08s          
  |++++++++++++++++++++++++++++++++                  | 62% ~08s          
  |++++++++++++++++++++++++++++++++                  | 64% ~08s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~08s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~07s          
  |++++++++++++++++++++++++++++++++++                | 68% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~07s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~06s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=21s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~08s          
  |++                                                | 2 % ~08s          
  |++                                                | 3 % ~08s          
  |+++                                               | 4 % ~07s          
  |+++                                               | 5 % ~07s          
  |++++                                              | 6 % ~07s          
  |++++                                              | 7 % ~07s          
  |+++++                                             | 8 % ~07s          
  |+++++                                             | 9 % ~07s          
  |++++++                                            | 10% ~07s          
  |++++++                                            | 11% ~07s          
  |+++++++                                           | 12% ~07s          
  |+++++++                                           | 13% ~07s          
  |++++++++                                          | 14% ~06s          
  |++++++++                                          | 15% ~06s          
  |+++++++++                                         | 16% ~06s          
  |+++++++++                                         | 17% ~06s          
  |++++++++++                                        | 18% ~06s          
  |++++++++++                                        | 19% ~06s          
  |+++++++++++                                       | 20% ~06s          
  |+++++++++++                                       | 21% ~06s          
  |++++++++++++                                      | 22% ~06s          
  |++++++++++++                                      | 23% ~06s          
  |+++++++++++++                                     | 24% ~06s          
  |+++++++++++++                                     | 25% ~06s          
  |++++++++++++++                                    | 26% ~06s          
  |++++++++++++++                                    | 27% ~05s          
  |+++++++++++++++                                   | 28% ~05s          
  |+++++++++++++++                                   | 29% ~05s          
  |++++++++++++++++                                  | 30% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |+++++++++++++++++                                 | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |++++++++++++++++++                                | 34% ~05s          
  |++++++++++++++++++                                | 35% ~05s          
  |+++++++++++++++++++                               | 36% ~05s          
  |+++++++++++++++++++                               | 37% ~05s          
  |++++++++++++++++++++                              | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |+++++++++++++++++++++                             | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |++++++++++++++++++++++                            | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |+++++++++++++++++++++++                           | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |++++++++++++++++++++++++                          | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |+++++++++++++++++++++++++                         | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |++++++++++++++++++++++++++                        | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |+++++++++++++++++++++++++++                       | 54% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |++++++++++++++++++++++++++++++                    | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |++++++++++++++++++++++++++++++++++                | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=08s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~28s          
  |++                                                | 2 % ~28s          
  |++                                                | 3 % ~28s          
  |+++                                               | 4 % ~27s          
  |+++                                               | 5 % ~27s          
  |++++                                              | 6 % ~26s          
  |++++                                              | 7 % ~27s          
  |+++++                                             | 9 % ~27s          
  |+++++                                             | 10% ~26s          
  |++++++                                            | 11% ~26s          
  |++++++                                            | 12% ~25s          
  |+++++++                                           | 13% ~25s          
  |+++++++                                           | 14% ~25s          
  |++++++++                                          | 15% ~24s          
  |++++++++                                          | 16% ~24s          
  |+++++++++                                         | 17% ~24s          
  |++++++++++                                        | 18% ~23s          
  |++++++++++                                        | 19% ~23s          
  |+++++++++++                                       | 20% ~23s          
  |+++++++++++                                       | 21% ~22s          
  |++++++++++++                                      | 22% ~22s          
  |++++++++++++                                      | 23% ~22s          
  |+++++++++++++                                     | 24% ~21s          
  |+++++++++++++                                     | 26% ~21s          
  |++++++++++++++                                    | 27% ~21s          
  |++++++++++++++                                    | 28% ~21s          
  |+++++++++++++++                                   | 29% ~21s          
  |+++++++++++++++                                   | 30% ~20s          
  |++++++++++++++++                                  | 31% ~20s          
  |++++++++++++++++                                  | 32% ~20s          
  |+++++++++++++++++                                 | 33% ~19s          
  |++++++++++++++++++                                | 34% ~19s          
  |++++++++++++++++++                                | 35% ~19s          
  |+++++++++++++++++++                               | 36% ~18s          
  |+++++++++++++++++++                               | 37% ~18s          
  |++++++++++++++++++++                              | 38% ~18s          
  |++++++++++++++++++++                              | 39% ~17s          
  |+++++++++++++++++++++                             | 40% ~17s          
  |+++++++++++++++++++++                             | 41% ~17s          
  |++++++++++++++++++++++                            | 43% ~16s          
  |++++++++++++++++++++++                            | 44% ~16s          
  |+++++++++++++++++++++++                           | 45% ~16s          
  |+++++++++++++++++++++++                           | 46% ~16s          
  |++++++++++++++++++++++++                          | 47% ~15s          
  |++++++++++++++++++++++++                          | 48% ~15s          
  |+++++++++++++++++++++++++                         | 49% ~15s          
  |+++++++++++++++++++++++++                         | 50% ~14s          
  |++++++++++++++++++++++++++                        | 51% ~14s          
  |+++++++++++++++++++++++++++                       | 52% ~14s          
  |+++++++++++++++++++++++++++                       | 53% ~13s          
  |++++++++++++++++++++++++++++                      | 54% ~13s          
  |++++++++++++++++++++++++++++                      | 55% ~13s          
  |+++++++++++++++++++++++++++++                     | 56% ~13s          
  |+++++++++++++++++++++++++++++                     | 57% ~12s          
  |++++++++++++++++++++++++++++++                    | 59% ~12s          
  |++++++++++++++++++++++++++++++                    | 60% ~12s          
  |+++++++++++++++++++++++++++++++                   | 61% ~11s          
  |+++++++++++++++++++++++++++++++                   | 62% ~11s          
  |++++++++++++++++++++++++++++++++                  | 63% ~11s          
  |++++++++++++++++++++++++++++++++                  | 64% ~10s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~10s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~10s          
  |++++++++++++++++++++++++++++++++++                | 67% ~09s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~09s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~09s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~09s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~08s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~08s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~08s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~07s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~07s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~07s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~06s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~06s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=29s  
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~08s          
  |++                                                | 2 % ~08s          
  |++                                                | 3 % ~08s          
  |+++                                               | 4 % ~08s          
  |+++                                               | 5 % ~08s          
  |++++                                              | 6 % ~07s          
  |++++                                              | 7 % ~07s          
  |+++++                                             | 8 % ~07s          
  |+++++                                             | 9 % ~07s          
  |++++++                                            | 11% ~07s          
  |++++++                                            | 12% ~07s          
  |+++++++                                           | 13% ~07s          
  |+++++++                                           | 14% ~07s          
  |++++++++                                          | 15% ~07s          
  |++++++++                                          | 16% ~07s          
  |+++++++++                                         | 17% ~06s          
  |+++++++++                                         | 18% ~06s          
  |++++++++++                                        | 19% ~06s          
  |++++++++++                                        | 20% ~06s          
  |+++++++++++                                       | 21% ~06s          
  |++++++++++++                                      | 22% ~06s          
  |++++++++++++                                      | 23% ~06s          
  |+++++++++++++                                     | 24% ~06s          
  |+++++++++++++                                     | 25% ~06s          
  |++++++++++++++                                    | 26% ~06s          
  |++++++++++++++                                    | 27% ~06s          
  |+++++++++++++++                                   | 28% ~06s          
  |+++++++++++++++                                   | 29% ~06s          
  |++++++++++++++++                                  | 31% ~06s          
  |++++++++++++++++                                  | 32% ~06s          
  |+++++++++++++++++                                 | 33% ~06s          
  |+++++++++++++++++                                 | 34% ~06s          
  |++++++++++++++++++                                | 35% ~05s          
  |++++++++++++++++++                                | 36% ~05s          
  |+++++++++++++++++++                               | 37% ~05s          
  |+++++++++++++++++++                               | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |++++++++++++++++++++                              | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |++++++++++++++++++++++                            | 42% ~05s          
  |++++++++++++++++++++++                            | 43% ~05s          
  |+++++++++++++++++++++++                           | 44% ~05s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |++++++++++++++++++++++++                          | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |+++++++++++++++++++++++++                         | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |++++++++++++++++++++++++++                        | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |+++++++++++++++++++++++++++                       | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |++++++++++++++++++++++++++++                      | 56% ~04s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |++++++++++++++++++++++++++++++                    | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |++++++++++++++++++++++++++++++++                  | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |++++++++++++++++++++++++++++++++++                | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=08s  
Calculating cluster 4

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~09s          
  |++                                                | 2 % ~09s          
  |++                                                | 3 % ~11s          
  |+++                                               | 5 % ~11s          
  |+++                                               | 6 % ~10s          
  |++++                                              | 7 % ~10s          
  |+++++                                             | 8 % ~10s          
  |+++++                                             | 9 % ~09s          
  |++++++                                            | 10% ~09s          
  |++++++                                            | 11% ~09s          
  |+++++++                                           | 13% ~09s          
  |+++++++                                           | 14% ~08s          
  |++++++++                                          | 15% ~08s          
  |+++++++++                                         | 16% ~08s          
  |+++++++++                                         | 17% ~08s          
  |++++++++++                                        | 18% ~08s          
  |++++++++++                                        | 20% ~08s          
  |+++++++++++                                       | 21% ~07s          
  |+++++++++++                                       | 22% ~07s          
  |++++++++++++                                      | 23% ~07s          
  |+++++++++++++                                     | 24% ~07s          
  |+++++++++++++                                     | 25% ~07s          
  |++++++++++++++                                    | 26% ~07s          
  |++++++++++++++                                    | 28% ~07s          
  |+++++++++++++++                                   | 29% ~07s          
  |+++++++++++++++                                   | 30% ~07s          
  |++++++++++++++++                                  | 31% ~07s          
  |+++++++++++++++++                                 | 32% ~06s          
  |+++++++++++++++++                                 | 33% ~06s          
  |++++++++++++++++++                                | 34% ~06s          
  |++++++++++++++++++                                | 36% ~06s          
  |+++++++++++++++++++                               | 37% ~06s          
  |+++++++++++++++++++                               | 38% ~06s          
  |++++++++++++++++++++                              | 39% ~06s          
  |+++++++++++++++++++++                             | 40% ~06s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |++++++++++++++++++++++                            | 43% ~05s          
  |++++++++++++++++++++++                            | 44% ~05s          
  |+++++++++++++++++++++++                           | 45% ~05s          
  |+++++++++++++++++++++++                           | 46% ~05s          
  |++++++++++++++++++++++++                          | 47% ~05s          
  |+++++++++++++++++++++++++                         | 48% ~05s          
  |+++++++++++++++++++++++++                         | 49% ~05s          
  |++++++++++++++++++++++++++                        | 51% ~05s          
  |++++++++++++++++++++++++++                        | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |++++++++++++++++++++++++++++                      | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |+++++++++++++++++++++++++++++                     | 56% ~04s          
  |+++++++++++++++++++++++++++++                     | 57% ~04s          
  |++++++++++++++++++++++++++++++                    | 59% ~04s          
  |++++++++++++++++++++++++++++++                    | 60% ~04s          
  |+++++++++++++++++++++++++++++++                   | 61% ~04s          
  |++++++++++++++++++++++++++++++++                  | 62% ~04s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |++++++++++++++++++++++++++++++++++                | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=09s  
Calculating cluster 5

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~11s          
  |++                                                | 2 % ~11s          
  |++                                                | 3 % ~11s          
  |+++                                               | 4 % ~11s          
  |+++                                               | 6 % ~11s          
  |++++                                              | 7 % ~11s          
  |++++                                              | 8 % ~11s          
  |+++++                                             | 9 % ~11s          
  |+++++                                             | 10% ~10s          
  |++++++                                            | 11% ~10s          
  |+++++++                                           | 12% ~10s          
  |+++++++                                           | 13% ~10s          
  |++++++++                                          | 14% ~10s          
  |++++++++                                          | 16% ~10s          
  |+++++++++                                         | 17% ~10s          
  |+++++++++                                         | 18% ~10s          
  |++++++++++                                        | 19% ~10s          
  |++++++++++                                        | 20% ~10s          
  |+++++++++++                                       | 21% ~10s          
  |++++++++++++                                      | 22% ~10s          
  |++++++++++++                                      | 23% ~09s          
  |+++++++++++++                                     | 24% ~09s          
  |+++++++++++++                                     | 26% ~09s          
  |++++++++++++++                                    | 27% ~09s          
  |++++++++++++++                                    | 28% ~09s          
  |+++++++++++++++                                   | 29% ~09s          
  |+++++++++++++++                                   | 30% ~09s          
  |++++++++++++++++                                  | 31% ~09s          
  |+++++++++++++++++                                 | 32% ~08s          
  |+++++++++++++++++                                 | 33% ~08s          
  |++++++++++++++++++                                | 34% ~08s          
  |++++++++++++++++++                                | 36% ~08s          
  |+++++++++++++++++++                               | 37% ~08s          
  |+++++++++++++++++++                               | 38% ~08s          
  |++++++++++++++++++++                              | 39% ~08s          
  |++++++++++++++++++++                              | 40% ~08s          
  |+++++++++++++++++++++                             | 41% ~07s          
  |++++++++++++++++++++++                            | 42% ~07s          
  |++++++++++++++++++++++                            | 43% ~07s          
  |+++++++++++++++++++++++                           | 44% ~07s          
  |+++++++++++++++++++++++                           | 46% ~07s          
  |++++++++++++++++++++++++                          | 47% ~07s          
  |++++++++++++++++++++++++                          | 48% ~07s          
  |+++++++++++++++++++++++++                         | 49% ~07s          
  |+++++++++++++++++++++++++                         | 50% ~06s          
  |++++++++++++++++++++++++++                        | 51% ~06s          
  |+++++++++++++++++++++++++++                       | 52% ~06s          
  |+++++++++++++++++++++++++++                       | 53% ~06s          
  |++++++++++++++++++++++++++++                      | 54% ~06s          
  |++++++++++++++++++++++++++++                      | 56% ~06s          
  |+++++++++++++++++++++++++++++                     | 57% ~06s          
  |+++++++++++++++++++++++++++++                     | 58% ~05s          
  |++++++++++++++++++++++++++++++                    | 59% ~05s          
  |++++++++++++++++++++++++++++++                    | 60% ~05s          
  |+++++++++++++++++++++++++++++++                   | 61% ~05s          
  |++++++++++++++++++++++++++++++++                  | 62% ~05s          
  |++++++++++++++++++++++++++++++++                  | 63% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~05s          
  |++++++++++++++++++++++++++++++++++                | 67% ~04s          
  |++++++++++++++++++++++++++++++++++                | 68% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=14s  
Calculating cluster 6

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~20s          
  |++                                                | 2 % ~19s          
  |++                                                | 3 % ~19s          
  |+++                                               | 5 % ~18s          
  |+++                                               | 6 % ~18s          
  |++++                                              | 7 % ~18s          
  |++++                                              | 8 % ~18s          
  |+++++                                             | 9 % ~18s          
  |++++++                                            | 10% ~17s          
  |++++++                                            | 11% ~18s          
  |+++++++                                           | 12% ~18s          
  |+++++++                                           | 14% ~17s          
  |++++++++                                          | 15% ~17s          
  |++++++++                                          | 16% ~17s          
  |+++++++++                                         | 17% ~17s          
  |++++++++++                                        | 18% ~16s          
  |++++++++++                                        | 19% ~16s          
  |+++++++++++                                       | 20% ~16s          
  |+++++++++++                                       | 22% ~15s          
  |++++++++++++                                      | 23% ~15s          
  |++++++++++++                                      | 24% ~15s          
  |+++++++++++++                                     | 25% ~15s          
  |++++++++++++++                                    | 26% ~15s          
  |++++++++++++++                                    | 27% ~14s          
  |+++++++++++++++                                   | 28% ~14s          
  |+++++++++++++++                                   | 30% ~14s          
  |++++++++++++++++                                  | 31% ~14s          
  |++++++++++++++++                                  | 32% ~13s          
  |+++++++++++++++++                                 | 33% ~13s          
  |++++++++++++++++++                                | 34% ~13s          
  |++++++++++++++++++                                | 35% ~13s          
  |+++++++++++++++++++                               | 36% ~12s          
  |+++++++++++++++++++                               | 38% ~12s          
  |++++++++++++++++++++                              | 39% ~12s          
  |++++++++++++++++++++                              | 40% ~12s          
  |+++++++++++++++++++++                             | 41% ~12s          
  |++++++++++++++++++++++                            | 42% ~11s          
  |++++++++++++++++++++++                            | 43% ~11s          
  |+++++++++++++++++++++++                           | 44% ~11s          
  |+++++++++++++++++++++++                           | 45% ~11s          
  |++++++++++++++++++++++++                          | 47% ~11s          
  |++++++++++++++++++++++++                          | 48% ~10s          
  |+++++++++++++++++++++++++                         | 49% ~10s          
  |+++++++++++++++++++++++++                         | 50% ~10s          
  |++++++++++++++++++++++++++                        | 51% ~10s          
  |+++++++++++++++++++++++++++                       | 52% ~09s          
  |+++++++++++++++++++++++++++                       | 53% ~09s          
  |++++++++++++++++++++++++++++                      | 55% ~09s          
  |++++++++++++++++++++++++++++                      | 56% ~09s          
  |+++++++++++++++++++++++++++++                     | 57% ~09s          
  |+++++++++++++++++++++++++++++                     | 58% ~09s          
  |++++++++++++++++++++++++++++++                    | 59% ~08s          
  |+++++++++++++++++++++++++++++++                   | 60% ~08s          
  |+++++++++++++++++++++++++++++++                   | 61% ~08s          
  |++++++++++++++++++++++++++++++++                  | 62% ~08s          
  |++++++++++++++++++++++++++++++++                  | 64% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=20s  
Calculating cluster 7

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~07s          
  |++                                                | 2 % ~07s          
  |++                                                | 3 % ~07s          
  |+++                                               | 4 % ~07s          
  |+++                                               | 5 % ~10s          
  |++++                                              | 6 % ~09s          
  |++++                                              | 8 % ~09s          
  |+++++                                             | 9 % ~09s          
  |+++++                                             | 10% ~08s          
  |++++++                                            | 11% ~08s          
  |++++++                                            | 12% ~08s          
  |+++++++                                           | 13% ~08s          
  |+++++++                                           | 14% ~07s          
  |++++++++                                          | 15% ~07s          
  |+++++++++                                         | 16% ~07s          
  |+++++++++                                         | 17% ~07s          
  |++++++++++                                        | 18% ~07s          
  |++++++++++                                        | 19% ~07s          
  |+++++++++++                                       | 20% ~07s          
  |+++++++++++                                       | 22% ~06s          
  |++++++++++++                                      | 23% ~06s          
  |++++++++++++                                      | 24% ~06s          
  |+++++++++++++                                     | 25% ~06s          
  |+++++++++++++                                     | 26% ~06s          
  |++++++++++++++                                    | 27% ~06s          
  |++++++++++++++                                    | 28% ~06s          
  |+++++++++++++++                                   | 29% ~06s          
  |++++++++++++++++                                  | 30% ~06s          
  |++++++++++++++++                                  | 31% ~06s          
  |+++++++++++++++++                                 | 32% ~06s          
  |+++++++++++++++++                                 | 33% ~06s          
  |++++++++++++++++++                                | 34% ~06s          
  |++++++++++++++++++                                | 35% ~05s          
  |+++++++++++++++++++                               | 37% ~05s          
  |+++++++++++++++++++                               | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |++++++++++++++++++++                              | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |+++++++++++++++++++++                             | 42% ~05s          
  |++++++++++++++++++++++                            | 43% ~05s          
  |+++++++++++++++++++++++                           | 44% ~05s          
  |+++++++++++++++++++++++                           | 45% ~05s          
  |++++++++++++++++++++++++                          | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |+++++++++++++++++++++++++                         | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |++++++++++++++++++++++++++                        | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |+++++++++++++++++++++++++++                       | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |++++++++++++++++++++++++++++                      | 56% ~04s          
  |+++++++++++++++++++++++++++++                     | 57% ~04s          
  |++++++++++++++++++++++++++++++                    | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |+++++++++++++++++++++++++++++++                   | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |++++++++++++++++++++++++++++++++                  | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |++++++++++++++++++++++++++++++++++                | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=08s  
Calculating cluster 8

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~22s          
  |++                                                | 2 % ~22s          
  |++                                                | 3 % ~21s          
  |+++                                               | 5 % ~21s          
  |+++                                               | 6 % ~20s          
  |++++                                              | 7 % ~20s          
  |+++++                                             | 8 % ~20s          
  |+++++                                             | 9 % ~20s          
  |++++++                                            | 10% ~20s          
  |++++++                                            | 12% ~20s          
  |+++++++                                           | 13% ~20s          
  |+++++++                                           | 14% ~19s          
  |++++++++                                          | 15% ~19s          
  |+++++++++                                         | 16% ~19s          
  |+++++++++                                         | 17% ~19s          
  |++++++++++                                        | 19% ~19s          
  |++++++++++                                        | 20% ~18s          
  |+++++++++++                                       | 21% ~18s          
  |++++++++++++                                      | 22% ~18s          
  |++++++++++++                                      | 23% ~17s          
  |+++++++++++++                                     | 24% ~17s          
  |+++++++++++++                                     | 26% ~17s          
  |++++++++++++++                                    | 27% ~16s          
  |++++++++++++++                                    | 28% ~16s          
  |+++++++++++++++                                   | 29% ~16s          
  |++++++++++++++++                                  | 30% ~15s          
  |++++++++++++++++                                  | 31% ~15s          
  |+++++++++++++++++                                 | 33% ~15s          
  |+++++++++++++++++                                 | 34% ~15s          
  |++++++++++++++++++                                | 35% ~14s          
  |+++++++++++++++++++                               | 36% ~14s          
  |+++++++++++++++++++                               | 37% ~14s          
  |++++++++++++++++++++                              | 38% ~13s          
  |++++++++++++++++++++                              | 40% ~13s          
  |+++++++++++++++++++++                             | 41% ~13s          
  |+++++++++++++++++++++                             | 42% ~12s          
  |++++++++++++++++++++++                            | 43% ~12s          
  |+++++++++++++++++++++++                           | 44% ~12s          
  |+++++++++++++++++++++++                           | 45% ~12s          
  |++++++++++++++++++++++++                          | 47% ~11s          
  |++++++++++++++++++++++++                          | 48% ~11s          
  |+++++++++++++++++++++++++                         | 49% ~11s          
  |+++++++++++++++++++++++++                         | 50% ~11s          
  |++++++++++++++++++++++++++                        | 51% ~10s          
  |+++++++++++++++++++++++++++                       | 52% ~10s          
  |+++++++++++++++++++++++++++                       | 53% ~10s          
  |++++++++++++++++++++++++++++                      | 55% ~09s          
  |++++++++++++++++++++++++++++                      | 56% ~09s          
  |+++++++++++++++++++++++++++++                     | 57% ~09s          
  |++++++++++++++++++++++++++++++                    | 58% ~09s          
  |++++++++++++++++++++++++++++++                    | 59% ~08s          
  |+++++++++++++++++++++++++++++++                   | 60% ~08s          
  |+++++++++++++++++++++++++++++++                   | 62% ~08s          
  |++++++++++++++++++++++++++++++++                  | 63% ~08s          
  |++++++++++++++++++++++++++++++++                  | 64% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~07s          
  |++++++++++++++++++++++++++++++++++                | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=20s  
Calculating cluster 9

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~11s          
  |++                                                | 2 % ~11s          
  |++                                                | 3 % ~10s          
  |+++                                               | 5 % ~10s          
  |+++                                               | 6 % ~10s          
  |++++                                              | 7 % ~10s          
  |++++                                              | 8 % ~10s          
  |+++++                                             | 9 % ~10s          
  |++++++                                            | 10% ~10s          
  |++++++                                            | 11% ~10s          
  |+++++++                                           | 12% ~09s          
  |+++++++                                           | 14% ~09s          
  |++++++++                                          | 15% ~09s          
  |++++++++                                          | 16% ~09s          
  |+++++++++                                         | 17% ~09s          
  |++++++++++                                        | 18% ~09s          
  |++++++++++                                        | 19% ~09s          
  |+++++++++++                                       | 20% ~09s          
  |+++++++++++                                       | 22% ~09s          
  |++++++++++++                                      | 23% ~08s          
  |++++++++++++                                      | 24% ~08s          
  |+++++++++++++                                     | 25% ~08s          
  |++++++++++++++                                    | 26% ~08s          
  |++++++++++++++                                    | 27% ~08s          
  |+++++++++++++++                                   | 28% ~08s          
  |+++++++++++++++                                   | 30% ~08s          
  |++++++++++++++++                                  | 31% ~08s          
  |++++++++++++++++                                  | 32% ~07s          
  |+++++++++++++++++                                 | 33% ~07s          
  |++++++++++++++++++                                | 34% ~07s          
  |++++++++++++++++++                                | 35% ~07s          
  |+++++++++++++++++++                               | 36% ~07s          
  |+++++++++++++++++++                               | 38% ~07s          
  |++++++++++++++++++++                              | 39% ~07s          
  |++++++++++++++++++++                              | 40% ~06s          
  |+++++++++++++++++++++                             | 41% ~06s          
  |++++++++++++++++++++++                            | 42% ~06s          
  |++++++++++++++++++++++                            | 43% ~06s          
  |+++++++++++++++++++++++                           | 44% ~06s          
  |+++++++++++++++++++++++                           | 45% ~06s          
  |++++++++++++++++++++++++                          | 47% ~06s          
  |++++++++++++++++++++++++                          | 48% ~06s          
  |+++++++++++++++++++++++++                         | 49% ~06s          
  |+++++++++++++++++++++++++                         | 50% ~05s          
  |++++++++++++++++++++++++++                        | 51% ~05s          
  |+++++++++++++++++++++++++++                       | 52% ~05s          
  |+++++++++++++++++++++++++++                       | 53% ~05s          
  |++++++++++++++++++++++++++++                      | 55% ~05s          
  |++++++++++++++++++++++++++++                      | 56% ~05s          
  |+++++++++++++++++++++++++++++                     | 57% ~05s          
  |+++++++++++++++++++++++++++++                     | 58% ~05s          
  |++++++++++++++++++++++++++++++                    | 59% ~04s          
  |+++++++++++++++++++++++++++++++                   | 60% ~04s          
  |+++++++++++++++++++++++++++++++                   | 61% ~04s          
  |++++++++++++++++++++++++++++++++                  | 62% ~04s          
  |++++++++++++++++++++++++++++++++                  | 64% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~04s          
  |++++++++++++++++++++++++++++++++++                | 67% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=10s  
Calculating cluster 10

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 15s      
  |+                                                 | 2 % ~01m 14s      
  |++                                                | 3 % ~01m 16s      
  |++                                                | 4 % ~01m 14s      
  |+++                                               | 5 % ~01m 13s      
  |+++                                               | 6 % ~01m 11s      
  |++++                                              | 7 % ~01m 10s      
  |++++                                              | 8 % ~01m 09s      
  |+++++                                             | 9 % ~01m 09s      
  |+++++                                             | 10% ~01m 08s      
  |++++++                                            | 11% ~01m 07s      
  |++++++                                            | 12% ~01m 06s      
  |+++++++                                           | 13% ~01m 06s      
  |+++++++                                           | 14% ~01m 05s      
  |++++++++                                          | 15% ~01m 04s      
  |++++++++                                          | 16% ~01m 03s      
  |+++++++++                                         | 17% ~01m 03s      
  |+++++++++                                         | 18% ~01m 03s      
  |++++++++++                                        | 19% ~01m 02s      
  |++++++++++                                        | 20% ~01m 01s      
  |+++++++++++                                       | 21% ~01m 00s      
  |+++++++++++                                       | 22% ~60s          
  |++++++++++++                                      | 23% ~59s          
  |++++++++++++                                      | 24% ~59s          
  |+++++++++++++                                     | 25% ~58s          
  |+++++++++++++                                     | 26% ~57s          
  |++++++++++++++                                    | 27% ~57s          
  |++++++++++++++                                    | 28% ~56s          
  |+++++++++++++++                                   | 29% ~56s          
  |+++++++++++++++                                   | 30% ~55s          
  |++++++++++++++++                                  | 31% ~54s          
  |++++++++++++++++                                  | 32% ~54s          
  |+++++++++++++++++                                 | 33% ~53s          
  |+++++++++++++++++                                 | 34% ~52s          
  |++++++++++++++++++                                | 35% ~52s          
  |++++++++++++++++++                                | 36% ~51s          
  |+++++++++++++++++++                               | 37% ~50s          
  |+++++++++++++++++++                               | 38% ~49s          
  |++++++++++++++++++++                              | 39% ~48s          
  |++++++++++++++++++++                              | 40% ~48s          
  |+++++++++++++++++++++                             | 41% ~47s          
  |+++++++++++++++++++++                             | 42% ~46s          
  |++++++++++++++++++++++                            | 43% ~45s          
  |++++++++++++++++++++++                            | 44% ~44s          
  |+++++++++++++++++++++++                           | 45% ~44s          
  |+++++++++++++++++++++++                           | 46% ~43s          
  |++++++++++++++++++++++++                          | 47% ~42s          
  |++++++++++++++++++++++++                          | 48% ~41s          
  |+++++++++++++++++++++++++                         | 49% ~40s          
  |+++++++++++++++++++++++++                         | 50% ~40s          
  |++++++++++++++++++++++++++                        | 51% ~39s          
  |++++++++++++++++++++++++++                        | 52% ~38s          
  |+++++++++++++++++++++++++++                       | 53% ~37s          
  |+++++++++++++++++++++++++++                       | 54% ~36s          
  |++++++++++++++++++++++++++++                      | 55% ~35s          
  |++++++++++++++++++++++++++++                      | 56% ~35s          
  |+++++++++++++++++++++++++++++                     | 57% ~34s          
  |+++++++++++++++++++++++++++++                     | 58% ~33s          
  |++++++++++++++++++++++++++++++                    | 59% ~32s          
  |++++++++++++++++++++++++++++++                    | 60% ~31s          
  |+++++++++++++++++++++++++++++++                   | 61% ~31s          
  |+++++++++++++++++++++++++++++++                   | 62% ~30s          
  |++++++++++++++++++++++++++++++++                  | 63% ~29s          
  |++++++++++++++++++++++++++++++++                  | 64% ~28s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~27s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~27s          
  |++++++++++++++++++++++++++++++++++                | 67% ~26s          
  |++++++++++++++++++++++++++++++++++                | 68% ~25s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~24s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~23s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~23s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~22s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~21s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~20s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~19s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~19s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~18s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~17s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~16s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~15s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~15s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~14s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 16s
Calculating cluster 11

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~17s          
  |++                                                | 2 % ~17s          
  |++                                                | 3 % ~16s          
  |+++                                               | 4 % ~16s          
  |+++                                               | 6 % ~16s          
  |++++                                              | 7 % ~16s          
  |++++                                              | 8 % ~16s          
  |+++++                                             | 9 % ~16s          
  |+++++                                             | 10% ~15s          
  |++++++                                            | 11% ~15s          
  |+++++++                                           | 12% ~15s          
  |+++++++                                           | 13% ~15s          
  |++++++++                                          | 14% ~16s          
  |++++++++                                          | 16% ~16s          
  |+++++++++                                         | 17% ~15s          
  |+++++++++                                         | 18% ~15s          
  |++++++++++                                        | 19% ~15s          
  |++++++++++                                        | 20% ~14s          
  |+++++++++++                                       | 21% ~14s          
  |++++++++++++                                      | 22% ~14s          
  |++++++++++++                                      | 23% ~14s          
  |+++++++++++++                                     | 24% ~14s          
  |+++++++++++++                                     | 26% ~13s          
  |++++++++++++++                                    | 27% ~13s          
  |++++++++++++++                                    | 28% ~13s          
  |+++++++++++++++                                   | 29% ~13s          
  |+++++++++++++++                                   | 30% ~12s          
  |++++++++++++++++                                  | 31% ~12s          
  |+++++++++++++++++                                 | 32% ~12s          
  |+++++++++++++++++                                 | 33% ~12s          
  |++++++++++++++++++                                | 34% ~12s          
  |++++++++++++++++++                                | 36% ~11s          
  |+++++++++++++++++++                               | 37% ~11s          
  |+++++++++++++++++++                               | 38% ~11s          
  |++++++++++++++++++++                              | 39% ~11s          
  |++++++++++++++++++++                              | 40% ~11s          
  |+++++++++++++++++++++                             | 41% ~10s          
  |++++++++++++++++++++++                            | 42% ~10s          
  |++++++++++++++++++++++                            | 43% ~10s          
  |+++++++++++++++++++++++                           | 44% ~10s          
  |+++++++++++++++++++++++                           | 46% ~10s          
  |++++++++++++++++++++++++                          | 47% ~09s          
  |++++++++++++++++++++++++                          | 48% ~09s          
  |+++++++++++++++++++++++++                         | 49% ~09s          
  |+++++++++++++++++++++++++                         | 50% ~09s          
  |++++++++++++++++++++++++++                        | 51% ~09s          
  |+++++++++++++++++++++++++++                       | 52% ~08s          
  |+++++++++++++++++++++++++++                       | 53% ~08s          
  |++++++++++++++++++++++++++++                      | 54% ~08s          
  |++++++++++++++++++++++++++++                      | 56% ~08s          
  |+++++++++++++++++++++++++++++                     | 57% ~08s          
  |+++++++++++++++++++++++++++++                     | 58% ~07s          
  |++++++++++++++++++++++++++++++                    | 59% ~07s          
  |++++++++++++++++++++++++++++++                    | 60% ~07s          
  |+++++++++++++++++++++++++++++++                   | 61% ~07s          
  |++++++++++++++++++++++++++++++++                  | 62% ~07s          
  |++++++++++++++++++++++++++++++++                  | 63% ~06s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~06s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~06s          
  |++++++++++++++++++++++++++++++++++                | 67% ~06s          
  |++++++++++++++++++++++++++++++++++                | 68% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~05s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~05s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=18s  
Calculating cluster 12

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~25s          
  |++                                                | 2 % ~25s          
  |++                                                | 3 % ~25s          
  |+++                                               | 4 % ~24s          
  |+++                                               | 5 % ~24s          
  |++++                                              | 6 % ~24s          
  |++++                                              | 7 % ~23s          
  |+++++                                             | 8 % ~23s          
  |+++++                                             | 9 % ~23s          
  |++++++                                            | 10% ~23s          
  |++++++                                            | 11% ~23s          
  |+++++++                                           | 12% ~23s          
  |+++++++                                           | 13% ~22s          
  |++++++++                                          | 14% ~22s          
  |++++++++                                          | 15% ~22s          
  |+++++++++                                         | 16% ~21s          
  |+++++++++                                         | 17% ~21s          

Find top.var genes in cmp.top100markers.res1

Lets try to export these, with genes on rows and clusters on columns, and xpression value in data table

var.df <- cmp.top100markers.res1[cmp.top100markers.res1$gene %in% n.vargenes,]
var.df <- subset.data.frame(var.df, select = c("gene", "cluster", "avg_log2FC"))
var.df <- reshape2::dcast(var.df, gene~cluster, value.var = "avg_log2FC")
xlsx::write.xlsx(var.df, file = paste0(projectName, "_dim", ndims, "_candididateBiomarkGenes.xlsx"), sheetName = "res1", append = TRUE, row.names = FALSE)

Here’s the list of genes, plus some controls

res1.biomark.genes <- c("Aif1",
                                                "Aqp1",
                                                "Birc5",
                                                "Ccl3",
                                                "Ccr2",
                                                "Cd74",
                                                "Cdc20",
                                                "Cenpf",
                                                "Cst3",
                                                "Ctsh",
                                                "Dntt",
                                                "Elane",
                                                "Ermap",
                                                "F13a1",
                                                "Fcer1g",
                                                "Gm15915",
                                                "Gm17590",
                                                "H2-Aa",
                                                "H2-Eb1",
                                                "H2afx",
                                                "H2afy",
                                                "Hist1h2ac",
                                                "Hmgb2",
                                                "Hp",
                                                "Ighm",
                                                "Irf8",
                                                "Lgals3",
                                                "Lmo4",
                                                "Ms4a2",
                                                "Mt1",
                                                "Plac8",
                                                "Prtn3",
                                                "Rap1b",
                                                "Rgs1",
                                                "Vwf",
                                                "Wfdc17",
                                                "Csrp3",
                                                "Hist1h2ae",
                                                "Ifitm1",
                                                "Lgals1",
                                                "Tmsb4x",
                                                "Arl6ip1",
                                                "Car2",
                                                "Ccl9",
                                                "Ccnb2",
                                                "Cd9",
                                                "Cenpa",
                                                "Cpa3",
                                                "Fos",
                                                "Hist1h2ap",
                                                "Ly6c2",
                                                "Mpo",
                                                "Pclaf",
                                                "Slpi",
                                                "Top2a",
                                                "Ube2c",
                                                "Ly86",
                                                "Hist1h2bc",
                                                "Pf4",
                                                "Apoe",
                                                "Ctsg",
                                                "Car1",
                                                "Hmmr")
hkgenes <- c("Gapdh", "B2m", "Hprt", "Pgk1", "Rplp2", "Pgk1", "Ubc", "Ywhaz", "Ppia", "Pum1", "Psmc4", "Elf1", "Mrpl19")
surface.markers<- c("Cd34", 
                                        "Kit",
                                        "Cd48", 
                                        "Ly6a",
                                        "Ly6e",
                                        "Cd9",
                                        "Itga2b",
                                        "Ly86",
                                        "Itga6",
                                        "Cd55",
                                        "Slamf1",
                                        "Flt3"
                                        )

make vln plots per cluster

for(gene in res1.biomark.genes){
    plot.title <- paste0(projectName, "dim", ndims, "res1_", gene)
    myplot<- VlnPlot(cmp.object, features = gene, pt.size = 0.01) + ggtitle(plot.title)
    png(filename = paste0("VlnPlots/", plot.title, ".png"), height = 800, width = 1600)
    plot(myplot)
    dev.off()
}
for(gene in hkgenes){
    plot.title <- paste0(projectName, "dim", ndims, "res1_", gene)
    myplot<- VlnPlot(cmp.object, features = gene, pt.size = 0.01) + ggtitle(plot.title)
    png(filename = paste0("VlnPlots/", plot.title, "-hkgene.png"), height = 800, width = 1600)
    plot(myplot)
    dev.off()
}
for(gene in surface.markers){
    plot.title <- paste0(projectName, "dim", ndims, "res1_", gene)
    myplot<- VlnPlot(cmp.object, features = gene, pt.size = 0.01) + ggtitle(plot.title)
    png(filename = paste0("VlnPlots/", plot.title, "-surfMkr.png"), height = 800, width = 1600)
    plot(myplot)
    dev.off()
}

Plot candidate control genes

# VlnPlot(cmp.object, features = hkgenes, pt.size = 0.001, same.y.lims = FALSE, ncol = 2)
png(filename = paste0(projectName, "dim", ndims, "res1_TaqmanControls.png"), height = 1600, width = 2400)
VlnPlot(cmp.object, features = hkgenes, pt.size = 0.01, same.y.lims = FALSE, ncol = 5)
dev.off()

Res 1.5

repeat for top.var genes in cmp.top100markers.res1.5

top.var <- cmp.object@assays$RNA@var.features[1:150]
Idents(cmp.object) <- "RNA_snn_res.1.5"
cmp.allmarkers.res1.5 <- FindAllMarkers(cmp.object)
cmp.top100markers.res1.5 <- cmp.allmarkers.res1.5 %>% group_by(cluster) %>% top_n(n = 100, wt = abs(avg_log2FC))
n.vargenes <- c()
for(gene in top.var){
    if(gene %in% cmp.top100markers.res1.5$gene){
        n.vargenes <- c(n.vargenes, gene)
    }
}
print(length(n.vargenes))
top.var[!(top.var %in% n.vargenes)]

Lets try to export these, with genes on rows and clusters on columns, and xpression value in data table

var.df <- cmp.top100markers.res1.5[cmp.top100markers.res1.5$gene %in% n.vargenes,]
var.df <- subset.data.frame(var.df, select = c("gene", "cluster", "avg_log2FC"))
var.df <- reshape2::dcast(var.df, gene~cluster)
xlsx::write.xlsx(var.df, file = paste0(projectName, "_dim", ndims, "_candididateBiomarkGenes.xlsx"), sheetName = "res1.5", append = TRUE, row.names = FALSE)

For each resolution, what percentage of cells in each cluster are enriched for one of our clust.IDs?

Test: what percentage of each new clusterID matches one of the older clusters?

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        new.clusters <- sort(as.numeric(levels(cmp.object@meta.data[[meta.col]])))
        enrich.df <- data.frame(matrix(ncol = 4, nrow = length(new.clusters)))
        colnames(enrich.df) <- c(3, 17, 10, 11)
        rownames(enrich.df) <- new.clusters
        meta.df <- cmp.object@meta.data
        for(row.id in rownames(enrich.df)){
            tot.clus <- nrow(meta.df[meta.df[[meta.col]] == row.id,])
            for(col.id in colnames(enrich.df)){
                num.x <- nrow(meta.df[(meta.df[[meta.col]] == row.id) & (meta.df$clust.ID == col.id),])
                pct.x <- as.integer(num.x / tot.clus *100)
                # print(pct.x)
                enrich.df[row.id, col.id] <- pct.x
            }
        }
        colnames(enrich.df) <- sapply(colnames(enrich.df), function(x) paste0("oldcluster", x))
        rownames(enrich.df) <- sapply(rownames(enrich.df), function(x) paste0("newcluster", x))
        xlsx::write.xlsx(enrich.df, file = paste0("PctOfNewClustersOverlappingOldClusters_", projectName, "_dim", ndims, ".xlsx"), sheetName = paste0(gsub("RNA_snn_", "", meta.col)), append = TRUE)
        print(enrich.df)
    }
}

Absolutely terrible overlap, no enrichment of any of these across the new clustering algorithm. Maybe should try 95% variation covered

Find old cells on UMAP

time for the super scarey moment to see if the cells from seuratv1 still cluster together on in seurat v4

DimPlot(cmp.object,
                reduction = "umap",
                group.by = "clust.ID", 
                # split.by = "orig.ident",
                cols = c("gray", "orange", "blue", "red", "green"),)
DimPlot(cmp.object,
                reduction = "umap",
                group.by = "orig.ident", 
                split.by = "clust.ID",
                cols = c("gray", "orange", "blue", "red", "green"),)

Gene expression of old clustrs on new map

Let’s see if we can get some gene expression profiles on these…

gene.list <- c("Gata1", "Gata2", "Pf4", "Dntt", "Mpo", "Meis1", "Irf8", "Elane", "Fli1", "Zfpm1")
VlnPlot(cmp.object, features = gene.list, group.by = "clust.ID", pt.size = 0.01, cols = c("gray", "orange", "blue", "red", "green"))

Total var 80%

Neighborhood and umap

set total.var <- 80%

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
ndims <- length(which(cumsum(tot.var) <= 80))

cmp.object <- FindNeighbors(cmp.object, dims = 1:ndims)
cmp.object <- FindClusters(cmp.object, resolution = 0.5)
cmp.object <- RunUMAP(cmp.object, dims = 1: ndims)

Plot UMAP

for(x in c(0.5, 1, 1.5, 2, 2.5)){
    cmp.object <- FindClusters(cmp.object, resolution = x)
saveRDS(cmp.object, file = paste0(projectName, "_dim", ndims, ".RDS"))
}
for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        myplot <- DimPlot(cmp.object, 
                                            group.by = meta.col,
                                            reduction = "umap", 
                                            cols = color.palette
                                            ) + 
            ggtitle(paste0(projectName, " dim", ndims, "res", gsub("RNA_snn_res", "", meta.col) ))
        plot(myplot)
    }
}

Clustree

what’s the max resolution we can achieve while keepign clusters stable?

plot.title <- paste0(projectName, "_clustree_ndim", max(cmp.object@commands$RunUMAP.RNA.pca$dims))
my.clustree <- clustree(cmp.object, prefix = "RNA_snn_res.", node_colour = "sc3_stability", exprs = "scale.data") + 
    scale_color_continuous(low = 'red3', high = 'white') + 
    ggtitle(plot.title)
png(filename = paste0(plot.title, ".png"), height = 800, width = 1600)
plot(my.clustree)
dev.off()

for each resolution, number/percentage of cells in each cluster?

tot.cells <- nrow(cmp.object@meta.data)
for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        new.clusters <- sort(as.numeric(levels(cmp.object@meta.data[[meta.col]])))
        stats.df <- data.frame(matrix(ncol = 2, nrow = length(new.clusters)))
        colnames(stats.df) <- c("num_cells", "pct_pop")
        rownames(stats.df) <- new.clusters
        meta.df <- cmp.object@meta.data
        for(row.id in rownames(stats.df)){
                num.x <- nrow(meta.df[meta.df[meta.col] == row.id,])
                pct.x <- as.integer(num.x / tot.cells *100)
                # print(pct.x)
                stats.df[row.id, "num_cells"] <- num.x
                stats.df[row.id, "pct_pop"] <- pct.x
        }
        print(stats.df)
    }
}

For each resolution, what percentage of cells in each cluster are enriched for one of our clust.IDs?

Test: what percentage of each new clusterID matches one of the older clusters?

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        new.clusters <- sort(as.numeric(levels(cmp.object@meta.data[[meta.col]])))
        enrich.df <- data.frame(matrix(ncol = 4, nrow = length(new.clusters)))
        colnames(enrich.df) <- c(3, 17, 10, 11)
        rownames(enrich.df) <- new.clusters
        meta.df <- cmp.object@meta.data
        for(row.id in rownames(enrich.df)){
            tot.clus <- nrow(meta.df[meta.df[[meta.col]] == row.id,])
            for(col.id in colnames(enrich.df)){
                num.x <- nrow(meta.df[(meta.df[[meta.col]] == row.id) & (meta.df$clust.ID == col.id),])
                pct.x <- as.integer(num.x / tot.clus *100)
                # print(pct.x)
                enrich.df[row.id, col.id] <- pct.x
            }
        }
        colnames(enrich.df) <- sapply(colnames(enrich.df), function(x) paste0("oldcluster", x))
        rownames(enrich.df) <- sapply(rownames(enrich.df), function(x) paste0("newcluster", x))
        xlsx::write.xlsx(enrich.df, file = paste0("PctOfNewClustersOverlappingOldClusters_", projectName, "_dim", ndims, ".xlsx"), sheetName = paste0(gsub("RNA_snn_", "", meta.col)), append = TRUE)
        print(enrich.df)
    }
}

Absolutely terrible overlap, no enrichment of any of these across the new clustering algorithm. Maybe should try 95% variation covered

Find old cells on UMAP

time for the super scarey moment to see if the cells from seuratv1 still cluster together on in seurat v4

DimPlot(cmp.object,
                reduction = "umap",
                group.by = "clust.ID", 
                # split.by = "orig.ident",
                cols = c("gray", "orange", "blue", "red", "green"),)
DimPlot(cmp.object,
                reduction = "umap",
                group.by = "orig.ident", 
                split.by = "clust.ID",
                cols = c("gray", "orange", "blue", "red", "green"),)

Total var 95%

Neighborhood and umap

set total.var <- 95%

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
ndims <- length(which(cumsum(tot.var) <= 95))

cmp.object <- FindNeighbors(cmp.object, dims = 1:ndims)
cmp.object <- FindClusters(cmp.object, resolution = 0.5)
cmp.object <- RunUMAP(cmp.object, dims = 1: ndims)

Plot UMAP

for(x in c(0.5, 1, 1.5, 2, 2.5)){
    cmp.object <- FindClusters(cmp.object, resolution = x)
}
saveRDS(cmp.object, file = paste0(projectName, "_dim", ndims, ".RDS"))
cmp.object <- readRDS("CMP_dim41.RDS")
plot.title <- paste0(projectName, "_clustree_ndim", max(cmp.object@commands$RunUMAP.RNA.pca$dims))
my.clustree <- clustree(cmp.object, prefix = "RNA_snn_res.", node_colour = "sc3_stability", exprs = "scale.data") + 
    scale_color_continuous(low = 'red3', high = 'white') + 
    ggtitle(plot.title)
png(filename = paste0(plot.title, ".png"), height = 800, width = 1600)
plot(my.clustree)
dev.off()

For each resolution, what percentage of cells in each cluster are enriched for one of our clust.IDs?

Test: what percentage of each new clusterID matches one of the older clusters?

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        new.clusters <- sort(as.numeric(levels(cmp.object@meta.data[[meta.col]])))
        enrich.df <- data.frame(matrix(ncol = 4, nrow = length(new.clusters)))
        colnames(enrich.df) <- c(3, 17, 10, 11)
        rownames(enrich.df) <- new.clusters
        meta.df <- cmp.object@meta.data
        for(row.id in rownames(enrich.df)){
            tot.clus <- nrow(meta.df[meta.df[[meta.col]] == row.id,])
            for(col.id in colnames(enrich.df)){
                num.x <- nrow(meta.df[(meta.df[[meta.col]] == row.id) & (meta.df$clust.ID == col.id),])
                pct.x <- as.integer(num.x / tot.clus *100)
                # print(pct.x)
                enrich.df[row.id, col.id] <- pct.x
            }
        }
        colnames(enrich.df) <- sapply(colnames(enrich.df), function(x) paste0("oldcluster", x))
        rownames(enrich.df) <- sapply(rownames(enrich.df), function(x) paste0("newcluster", x))
        xlsx::write.xlsx(enrich.df, file = paste0("PctOfNewClustersOverlappingOldClusters_", projectName, "_dim", ndims, ".xlsx"), sheetName = paste0(gsub("RNA_snn_", "", meta.col)), append = TRUE)
        print(enrich.df)
    }
}

Absolutely terrible overlap, no enrichment of any of these across the new clustering algorithm. Maybe should try 95% variation covered

Find old cells on UMAP

time for the super scarey moment to see if the cells from seuratv1 still cluster together on in seurat v4

DimPlot(cmp.object,
                reduction = "umap",
                group.by = "clust.ID", 
                pt.size = .1,
                # split.by = "orig.ident",
                cols = c("gray", "orange", "blue", "red", "green"),)
DimPlot(cmp.object,
                reduction = "umap",
                group.by = "orig.ident", 
                split.by = "clust.ID",
                cols = c("gray", "orange", "blue", "red", "green"),)

Gene expression of old clustrs on new map

Let’s see if we can get some gene expression profiles on these…

gene.list <- c("Gata1", "Gata2", "Pf4", "Dntt", "Mpo", "Meis1", "Irf8", "Elane", "Fli1", "Zfpm1")
VlnPlot(cmp.object, features = gene.list, group.by = "clust.ID", pt.size = 0.01, cols = c("gray", "orange", "blue", "red", "green"))

Used the exce doc to do some fancy conditional formatting. Old cluster 17 is pretty dispersed until you it resolution 2.5. Otherise, cells in old cluster 17 do not constitute more than 40% of any cells in the new clusters.
As far as I can see, the two approaches are to do DGEof new CMP w/ resolution = 2.5, AND/OR do DGe using older cluster IDs. Sure seems to make sense to do both…

DGE w/ resolution = 2.5

Strt with comparing all clusters against all other clusters Write out cluster info

calculate FindAllMarkers() for different idents and save to new file

ident.list <- c("RNA_snn_res.0.5", "RNA_snn_res.1", "RNA_snn_res.1.5", "RNA_snn_res.2", "RNA_snn_res.2.5", "clust.ID")
for(tested.ident in ident.list){
    Idents(cmp.object) <- tested.ident
    all.markers <- FindAllMarkers(cmp.object)
    xlsx::write.xlsx(x = all.markers[,c("avg_log2FC", "p_val_adj", "cluster", "gene")], 
                                     file = paste0(projectName, "_FindALLMarkers_res2.5.xlsx"), 
                                     sheetName = tested.ident, 
                                     col.names = TRUE, 
                                     row.names = FALSE, 
                                     append = TRUE)
}

Create FindAllMarkers() lists for GSEA

Idents(cmp.object) <- "RNA_snn_res.2.5"
res.2.5.allmarkers <- FindAllMarkers(cmp.object)

Map HGNC symbols

Mouse2HumanTable <- Mouse2Human(res.2.5.allmarkers$gene)

HGNC <- with(Mouse2HumanTable, Mouse2HumanTable$HGNC[match(res.2.5.allmarkers$gene, Mouse2HumanTable$MGI)])
head(res.2.5.allmarkers)
res.2.5.allmarkers$HGNC <- HGNC
tail(res.2.5.allmarkers)
sig.res.2.5 <- res.2.5.allmarkers[res.2.5.allmarkers$p_val_adj <= 0.05, ]
sig.res.2.5 <- sig.res.2.5[c("avg_log2FC", "HGNC", "cluster")]
sig.res.2.5 <- sig.res.2.5[!(sig.res.2.5$HGNC == "" | is.na(sig.res.2.5$HGNC)),] # GSEA will fail if there are any blanks or NAs in the table
sig.res.2.5 <- sig.res.2.5[]
for(cluster in unique(sig.res.2.5$cluster)){
    print(paste("writing cluster", cluster))
    new.table <- sig.res.2.5[sig.res.2.5$cluster == cluster, c("HGNC", "avg_log2FC")]
    new.table <- new.table[order(-new.table$avg_log2FC), ]
    write.table(new.table, file = paste0("RankList_res2.5_findAll_hgnc/res.2.5cluster", cluster, ".rnk"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = "\t", )
    
}

calculate FindMarkers() that distinguish each cluster (might overlab between clusters)

ident.list <- c("RNA_snn_res.0.5", "RNA_snn_res.1", "RNA_snn_res.1.5", "RNA_snn_res.2", "RNA_snn_res.2.5", "clust.ID")
for(tested.ident in ident.list){
    object.copy <- cmp.object
    Idents(object.copy) <- tested.ident
    print(paste("testing", tested.ident))
    for (cluster in sort(as.numeric(levels(object.copy@meta.data[[tested.ident]])))){
        print(paste("looking at cluster", cluster))
        cluster.markers <- FindMarkers(object.copy, ident.1 = cluster)
        try(
            xlsx::write.xlsx(x = cluster.markers[,c("avg_log2FC", "p_val_adj")], 
                                             file = paste0(projectName, "_FindMarkers_", gsub("RNA_snn_", "", tested.ident), ".xlsx"), 
                                             sheetName = paste0("clst", cluster), 
                                             col.names = TRUE, 
                                             row.names = TRUE, 
                                             append = TRUE)
        )   
    }
    remove(object.copy)
}
for (cluster in sort(as.numeric(levels(cmp.object@meta.data$RNA_snn_res.2.5)))){
    cluster.markers <- FindMarkers(cmp.object, ident.1 = cluster)
    xlsx::write.xlsx(x = cluster.markers[,c("avg_log2FC", "p_val_adj")], 
                                     file = paste0(projectName, "_FindMarkers_res2.5.xlsx"), 
                                     sheetName = paste0("clst", cluster), 
                                     col.names = TRUE, 
                                     row.names = TRUE, 
                                     append = TRUE)
}

Combine clusters that might represent old cluster ids

DGE w/ metadata against clust.ID against “0”

reset ident as “clust.ID” and rerun FindAllMarkers()

    Idents(cmp.object) <- "clust.ID"
    all.markers <- FindAllMarkers(cmp.object)
    xlsx::write.xlsx(x = all.markers[,c("avg_log2FC", "p_val_adj", "cluster", "gene")], 
                                     file = paste0(projectName, "_FindALLMarkers_clustID.xlsx"), 
                                     sheetName = "clustID", 
                                     col.names = TRUE, 
                                     row.names = FALSE, 
                                     append = TRUE)
# Idents(cmp.object) <- "clust.ID"
for (cluster in unique(cmp.object@meta.data$clust.ID)){
    print(cluster)
    cluster.markers <- FindMarkers(cmp.object, ident.1 = cluster)
    xlsx::write.xlsx(x = cluster.markers[,c("avg_log2FC", "p_val_adj")], 
                                     file = paste0(projectName, "_FindMarkers_clustID.xlsx"), 
                                     sheetName = paste0("oldclust", cluster), 
                                     col.names = TRUE, 
                                     row.names = TRUE, 
                                     append = TRUE)
}

Distinguishing features of clusters

Previously defined biomark genes based on PC contributions. Original list was based on all msAggr, but let’s see how CMP subset does?

VizDimLoadings(cmp.object, dims = 1:10, nfeatures = 30, reduction = "pca", ncol = 2)
pca.df <- cmp.object[["pca"]]
pca.df <- as.data.frame(as.matrix(slot(object = pca.df, name = "feature.loadings")))
print(cmp.object[["pca"]], dims = 2, nfeatures = 5)
rownames(pca.df[pca.df$PC_2 %in% sort(pca.df$PC_2, decreasing = TRUE)[1:5], ])
rownames(pca.df[pca.df$PC_2 %in% sort(pca.df$PC_2)[1:5], ])

now we can get a list of principal components!
first pull the list of oldAnalysis CMP top PC genes

cmp.biomark <- read.table(file = "/Users/heustonef/Desktop/CMPSubpops/BioMark/ProbePanels/CMP_PCTopGenes.txt", sep = "\t", header = TRUE)
biomark.cmptargets <- c()
for(df.col in 1:ncol(cmp.biomark)){
    biomark.cmptargets <- c(biomark.cmptargets, biomark[,df.col])
}
print(colnames(biomark))
print(paste("total gene count:", length(biomark.cmptargets)))

Now get the list of current pc gene trgets (oldAnalysis used ndim = 1:6, so we’ll start with that range)

pc.list <- c("PC_1", "PC_2", "PC_3", "PC_4", "PC_5", "PC_6")
pc.genes <- lapply(pc.list, function(x) rownames(pca.df[pca.df[[x]] %in% sort(pca.df[[x]], decreasing = TRUE)[1:30],])) #targeting roughly 180 genes like in biomark.cmptargets
pc.genes <- unique(unlist(pc.genes))
print(paste("total gene count:", length(pc.genes)))

Now compare the lists, I guess:

# setdiff(x,y) gives you things in x not in y. setdiff(y,x) gives you things in y not in x
setdiff(biomark.cmptargets, pc.genes)
# print(paste("\n length:", length(setdiff(biomark.cmptargets, pc.genes))))
writeLines(c("", "length:", length(setdiff(biomark.cmptargets, pc.genes))))

Umm, yeah that went kinda how I expected. Let’s do this again, but for the actual biomark gene lists.

biomark <- read.table(file = "/Users/heustonef/Desktop/CMPSubpops/BioMark/ProbePanels/BiomarkProbeList.txt", sep = "\t")
biomark <- biomark[,1]
setdiff(biomark, pc.genes)
writeLines(c("", "length:", length(setdiff(biomark, pc.genes))))

What if we increase the number of pcs but decrease the depth of each? This might cover more of biomark, which was originally developed using msAggr instead of only the CMP subset

pc.list <- c("PC_1", "PC_2", "PC_3", "PC_4", "PC_5", "PC_6", "PC_7", "PC_8", "PC_9", "PC_10")
pc.genes <- lapply(pc.list, function(x) rownames(pca.df[pca.df[[x]] %in% sort(pca.df[[x]], decreasing = TRUE)[1:20],]))
pc.genes <- unique(unlist(pc.genes))
print(paste("total gene count:", length(pc.genes)))
setdiff(biomark, pc.genes)
writeLines(c("", "length:", length(setdiff(biomark, pc.genes))))

For comparison, let’s just see how many of biomark.cmptargets were actually included in biomark

setdiff(biomark.cmptargets, biomark)
writeLines(c("", "length:", length(setdiff(biomark.cmptargets, pc.genes))))
length(biomark) - length(setdiff(biomark, biomark.cmptargets))
length(biomark) - length(setdiff(biomark, pc.genes))

So when you look at it like that, it’s not actually that far off.

What are the similarities?:

setdiff(setdiff(biomark, biomark.cmptargets), setdiff(biomark, pc.genes))

These are genes from the 97probes not in the old CMP set that are also not in the new CMP set. Other than Itga2b (which is a failed probe anyway), nothing screams. Also we’d have thrown Flt3 and Cd34 for in anyway because they’re requisite cell surface markers (also Flt3 surface marker is expensive but otherwise not noteworthy and not used in the current sorting strategy)

What about cell surface marker expression? * Cd34 * Cd16/32 * Cd9 * Cd41 * Cd48 * Sca1 (just throw that in for sh*&s and giggles)

surface.markers <- c("Cd34", "Fcgr3", "Fcgr2b", "Cd9", "Itga2b", "Cd48", "Ly6a")
FeaturePlot(cmp.object, features = surface.markers, pt.size = 1, split.by = "clust.ID", ncol = 1)

Save as png

png(filename = "FeaturePlot_CMP_surfaceMarkers_clustIDfacet.png", height = 1600, width = 1600)
FeaturePlot(cmp.object, features = surface.markers, pt.size = 1, split.by = "clust.ID", ncol = 1)
dev.off()

Compare @g hierarchcial clusteirng

Do clustering using biomark RNAs as input

# Read in BiomarkRNAs
biomark.rnas <- read.table('/Users/heustonef/Desktop/10XGenomicsData/BiomarkRNAs.txt')
biomark.rnas <- biomark.rnas$V1

use biomark RNAs to define dimensional reduction

cmp.object <- readRDS("CMP_raw.RDS")
cmp.object <- RunPCA(cmp.object, features = biomark.rnas, ndims.print = 1:5, , nfeatures.print = 5)
ElbowPlot(cmp.object, ndims = 50)

Now run the clustering

tot.var <- percent.variance(cmp.object@reductions$pca@stdev, plot.var = FALSE, return.val = TRUE)
ndims <- length(which(cumsum(tot.var) <= 90))

cmp.object <- FindNeighbors(cmp.object, dims = 1:ndims)
cmp.object <- FindClusters(cmp.object, resolution = 0.5)
cmp.object <- RunUMAP(cmp.object, dims = 1: ndims)

find the clusters

for(x in c(0.5, 1, 1.5, 2, 2.5)){
    cmp.object <- FindClusters(cmp.object, resolution = x)
}

Plot the umaps and cell cluster ids

for (meta.col in colnames(cmp.object@meta.data)){
    if(grepl(pattern = ("RNA_snn_res"), x = meta.col)==TRUE){
        myplot <- DimPlot(cmp.object, 
                                            group.by = meta.col,
                                            reduction = "umap", 
                                            cols = color.palette
                                            ) + 
            ggtitle(paste0(projectName, " dim", ndims, "res", gsub("RNA_snn_res", "", meta.col) ))
        plot(myplot)
    }
}

Calculate anticipated number of cells you’ll find in each biomark cluster

Get # cells in each cluster

tot.cellcount <- nrow(cmp.object@meta.data)
res05.list <- sort(unique(cmp.object@meta.data$RNA_snn_res.0.5), decreasing = FALSE)
sapply(res05.list, 
             function(x){
                print(
                    paste(
                        "cluster", x, "=", 
                        nrow(cmp.object@meta.data[cmp.object@meta.data$RNA_snn_res.0.5 == x,]), 
                        "cells or", 
                        round(nrow(cmp.object@meta.data[cmp.object@meta.data$RNA_snn_res.0.5 == x,])/tot.cellcount*100, digits = 2), 
                        "% of total"
                    )
                )
             }
            )

So we did the dimensional reduction based on the biomark RNAs, then did our UMAP nearest neighbor clustering.

In the biomark hierarchcial clustering analysis I assayed 167 cells. The smallest cluster I detected had 3 cells, or 1.8% of total, and this is an uncomfortably small number of cells. Based on the UMAP calculations I would therefore expect to find 11 or 12 of the predicted 15 clusters. I found 12, and I don’t really like that last one, so 11 or 12. Since I did the hierarchcial clustering yesterday and did this math today, we can say it was independent of these results and therefore totally legit. Yay!!

LS0tCnRpdGxlOiAiQ01QU3Vic2V0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIFVwZGF0ZXMKCiMjIFVwZGF0ZSAyMDIxLjA4LjE5ClB1cnN1aW5nIERpbTI1ICg4NSUgb2YgdmFyaWFuY2UgZXhwbGFpbmVkKSByZXMxIGFuZCByZXMxLjUgZm9yIGJpb21hcmsgdGFyZ2V0cwoKIyMgVXBkYXRlIDIwMjEuMDguMTEKTW9zdCB0aG9yb3VnaCB3YXkgdG8gcmVhZGRyZXNzIGRpZmZlcmVuY2VzIGJldHdlZW4gb3JpZ2luYWwgYW5kIGN1cnJlbnQgYW5hbHlzZXMgaXMgdG8ganN1dCByZWRvIHRoZSBiaW9tYXJrLiBUbyB0aGF0IGVuZCwgd2lsbCByZXN0YXJ0IGFuYWx5c2lzIG9mICpqdXN0KiBDTVBtMiwgZXhjbHVkaW5nIG90aGVyIGRhdGFzZXRzIChpLmUuLCBMU0ssIE1FUCwgR01QKS4gV2lsbCBhbHNvIGtlZXAgCgoKIyBOb3RlYm9vayBzZXR1cAoKQ3JlYXRpbmcgbmV3IHBpcGVsaW5lIHVzaW5nIHNldXJhdCB2NC4wLjIgYXZhaWxhYmxlIDIwMjEuMDYuMDgKCkxvYWQgbGlicmFyaWVzIHJlcXVpcmVkIGZvciBTZXVyYXR2NAoKIyMgTG9hZCBsaWJyYXJpZXMKYGBge3Igc2V0dXB9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KHBhdGNod29yaykKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGNsdXN0cmVlKQpgYGAKCiMjIFNldCBnbG9iYWwgdmFyaWFibGVzCmBgYHtyfQpwcm9qZWN0TmFtZSA8LSAiQ01QIgpqYWNrc3RyYXcuZGltIDwtIDQwCmBgYAoKIyMgU3RvcmUgc2Vzc2lvbiBpbmZvCmBgYHtyfQpzZXNzaW9uSW5mby5maWxlbmFtZSA8LSBwYXN0ZTAocHJvamVjdE5hbWUsICJfc2Vzc2lvbkluZm8udHh0IikKc2luayhzZXNzaW9uSW5mby5maWxlbmFtZSkKc2Vzc2lvbkluZm8oKQpzaW5rKCkKYGBgCgojIyBMb2FkIGxvY2FsIHNjcmlwdHMKYGBge3J9CnNvdXJjZSgiLi4vUkZ1bmN0aW9ucy9yZWFkXzEwWEdlbm9taWNzX2RhdGEuUiIpCnNvdXJjZSgiLi4vUkZ1bmN0aW9ucy9QZXJjZW50VmFyaWFuY2UuUiIpCnNvdXJjZSgiLi4vUkZ1bmN0aW9ucy9Nb3VzZTJIdW1hbl9pZGNvbnZlcnNpb24uUiIpCnNvdXJjZSAoIi4uL1JGdW5jdGlvbnMvQ29sb3JQYWxldHRlLlIiKQpgYGAKCiMgUmVhZCBDTVBtMgpgYGB7ciB3YXJuaW5nPUZBTFNFfQpzZXR3ZCgiLi4vLi4vY2VsbFJhbmdlci8iKSAjIHRlbXBvcmFyaWx5IGNoYW5naW5nIHdkIG9ubHkgd29ya3MgaWYgeW91IHJ1biB0aGUgZW50aXJlIGNodW5rIGF0IG9uY2UKZGF0YV9maWxlLmxpc3QgPC0gcmVhZF8xMFhHZW5vbWljc19kYXRhKHNhbXBsZS5saXN0ID0gIkNNUG0yIikKb2JqZWN0LmRhdGEgPC1SZWFkMTBYKGRhdGFfZmlsZS5saXN0KQpgYGAKCgoKYGBge3J9CmNtcC5vYmplY3Q8LSBDcmVhdGVTZXVyYXRPYmplY3QoY291bnRzID0gb2JqZWN0LmRhdGEsIG1pbi5jZWxscyA9IDMsIG1pbi5nZW5lcyA9IDIwMCwgcHJvamVjdCA9IHByb2plY3ROYW1lKQpgYGAKCkNsZWFuIHVwIHRvIGZyZWUgbWVtb3J5CgpgYGB7cn0KcmVtb3ZlKG9iamVjdC5kYXRhKQpgYGAKCgpBZGQgbWl0b2Nob25kcmlhbCBtZXRhZGF0YSBhbmQgcGxvdCBzb21lIGJhc2ljIGZlYXR1cmVzCmBgYHtyfQpjbXAub2JqZWN0W1sicGVyY2VudC5tdCJdXSA8LSBQZXJjZW50YWdlRmVhdHVyZVNldChjbXAub2JqZWN0LCBwYXR0ZXJuID0gIl5tdC0iKQpWbG5QbG90KGNtcC5vYmplY3QsIGZlYXR1cmVzID0gYygibkZlYXR1cmVfUk5BIiwgIm5Db3VudF9STkEiLCAicGVyY2VudC5tdCIpLCBuY29sID0gMywgcHQuc2l6ZSA9IDAsIGZpbGwuYnkgPSAnb3JpZy5pZGVudCcsICkKYGBgCgoKYGBge3J9CnBsb3QxIDwtIEZlYXR1cmVTY2F0dGVyKGNtcC5vYmplY3QsIGZlYXR1cmUxID0gIm5Db3VudF9STkEiLCBmZWF0dXJlMiA9ICJwZXJjZW50Lm10IiwgZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIsIHB0LnNpemUgPSAwLjAxKQpwbG90MiA8LSBGZWF0dXJlU2NhdHRlcihjbXAub2JqZWN0LCBmZWF0dXJlMSA9ICJuQ291bnRfUk5BIiwgZmVhdHVyZTIgPSAibkZlYXR1cmVfUk5BIiwgZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIsIHB0LnNpemUgPSAwLjAxKQpwbG90MSArIHBsb3QyCmBgYAojIyBGaWx0ZXIgZGF0YQpyZW1vdmUgbG93IHF1YWxpdHkgY2VsbHMKcmVxdWlyZTogbkZlYXR1cmVfUk5BIGJldHdlZW4gMjAwIGFuZCA0MDAwIChpbmNsdXNpdmUpCnJlcXVpcmU6IHBlcmNlbnQubXQgPD01CgpgYGB7cn0KcHJpbnQocGFzdGUoIm9yaWdpbmFsIG9iamVjdDoiLCBucm93KGNtcC5vYmplY3RAbWV0YS5kYXRhKSwgImNlbGxzIiwgc2VwID0gIiAiKSkKY21wLm9iamVjdCA8LSBzdWJzZXQoY21wLm9iamVjdCwgCgkJCQkJCQkJCQkJCXN1YnNldCA9IG5GZWF0dXJlX1JOQSA+PTIwMCAmIAoJCQkJCQkJCQkJCQkJbkZlYXR1cmVfUk5BIDw9IDQwMDAgJiAKCQkJCQkJCQkJCQkJCXBlcmNlbnQubXQgPD0gNQoJCQkJCQkJCQkJCQkpCnByaW50KHBhc3RlKCJuZXcgb2JqZWN0OiIsIG5yb3coY21wLm9iamVjdEBtZXRhLmRhdGEpLCAiY2VsbHMiLCBzZXAgPSAiICIpKQpgYGAKCgoKYGBge3J9CmNtcC5vYmplY3QgPC0gTm9ybWFsaXplRGF0YShjbXAub2JqZWN0LCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJMb2dOb3JtYWxpemUiLCBzY2FsZS5mYWN0b3IgPSAxMDAwMCkKYGBgCgoKRmluZCB2YXJpYWJsZSBmZWF0dXJlcwpgYGB7ciBmaWcud2lkdGggPSA1LCBmaWcuaGVpZ2h0ID0gMn0KY21wLm9iamVjdCA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhjbXAub2JqZWN0LCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCnRvcDEwIDwtIGhlYWQoVmFyaWFibGVGZWF0dXJlcyhjbXAub2JqZWN0KSwgMTApCnBsb3QxIDwtIFZhcmlhYmxlRmVhdHVyZVBsb3QoY21wLm9iamVjdCkKcGxvdDIgPC0gTGFiZWxQb2ludHMocGxvdCA9IHBsb3QxLCBwb2ludHMgPSB0b3AxMCwgcmVwZWwgPSBUUlVFKQpwbG90MSArIHBsb3QyCmBgYAoKIyMgU2NhbGUgZGF0YSAobGluZWFyIHRyYW5zZm9ybWF0aW9uKQpXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGNvbXBhcmluZyBsaWJyYXJ5IGRlcHRocywgc28gd2UnbGwganVzdCBkbyBub3JtYWxpemF0aW9uL1NjYWxlIGRhdGEKCmBgYHtyIGVjaG8gPSBGQUxTRX0KYWxsLmdlbmVzIDwtIHJvd25hbWVzKGNtcC5vYmplY3QpCmNtcC5vYmplY3QgPC0gU2NhbGVEYXRhKGNtcC5vYmplY3QsIGZlYXR1cmVzID0gYWxsLmdlbmVzLCB2YXJzLnRvLnJlZ3Jlc3MgPSBjKCJuRmVhdHVyZV9STkEiLCAibkNvdW50X1JOQSIpKQpgYGAKCiMjIFNhdmUgcmF3IG9iamVjdApgYGB7cn0Kc2F2ZVJEUyhjbXAub2JqZWN0LCBmaWxlID0gcGFzdGUwKHByb2plY3ROYW1lLCAiX3Jhdy5SRFMiKSkKYGBgCgoKCmBgYHtyfQpjbXAub2JqZWN0IDwtIFJ1blBDQShjbXAub2JqZWN0LCBmZWF0dXJlcyA9IFZhcmlhYmxlRmVhdHVyZXMoY21wLm9iamVjdCksIG5kaW1zLnByaW50ID0gMTo1LCBuZmVhdHVyZXMucHJpbnQgPSA1KQpgYGAKCmBgYHtyfQpEaW1QbG90KGNtcC5vYmplY3QsIHJlZHVjdGlvbiA9ICJwY2EiLCBncm91cC5ieSA9ICJvcmlnLmlkZW50IikKVml6RGltTG9hZGluZ3MoY21wLm9iamVjdCwgZGltcyA9IDE6NiwgbmZlYXR1cmVzID0gMTAsIHJlZHVjdGlvbiA9ICJwY2EiLCBuY29sID0gMykKCmBgYAoKQ2FsY3VsYXRlIGRpbWVuc2lvbmFsaXR5CmBgYHtyLCBmaWd1cmVzLXNpZGUsIGZpZy5zaG93PSdob2xkJywgb3V0LndpZHRoPSI1MCUifQpFbGJvd1Bsb3QoY21wLm9iamVjdCwgbmRpbXMgPSA1MCkKcGVyY2VudC52YXJpYW5jZShjbXAub2JqZWN0QHJlZHVjdGlvbnMkcGNhQHN0ZGV2KQpgYGAKTnVtYmVyIG9mIFBDcyBkZXNjcmliaW5nIFglIG9mIHZhcmlhbmNlCgpgYGB7cn0KdG90LnZhciA8LSBwZXJjZW50LnZhcmlhbmNlKGNtcC5vYmplY3RAcmVkdWN0aW9ucyRwY2FAc3RkZXYsIHBsb3QudmFyID0gRkFMU0UsIHJldHVybi52YWwgPSBUUlVFKQpwYXN0ZTAoIk51bSBwY3MgZm9yIDgwJSB2YXJpYW5jZToiLCBsZW5ndGgod2hpY2goY3Vtc3VtKHRvdC52YXIpIDw9IDgwKSkpCnBhc3RlMCgiTnVtIHBjcyBmb3IgODUlIHZhcmlhbmNlOiIsIGxlbmd0aCh3aGljaChjdW1zdW0odG90LnZhcikgPD0gODUpKSkKcGFzdGUwKCJOdW0gcGNzIGZvciA5MCUgdmFyaWFuY2U6IiwgbGVuZ3RoKHdoaWNoKGN1bXN1bSh0b3QudmFyKSA8PSA5MCkpKQpwYXN0ZTAoIk51bSBwY3MgZm9yIDk1JSB2YXJpYW5jZToiLCBsZW5ndGgod2hpY2goY3Vtc3VtKHRvdC52YXIpIDw9IDk1KSkpCgpgYGAKCiMgQWRkIGNsdXN0ZXIgSURzIGZyb20gU2V1cmF0IHYxCgpFeHBvcnRlZCBjZWxsIElEcyBmb3IgY2x1c3RlcnMgMywgMTcsIDEwLCAxMSBmcm9tIFNldXJhdCB2MS4gV2lsbCBhZGQgdGhlc2UgSURzIGFzIGEgbWV0YWRhdGEgY29sdW1uLiAgCkNyZWF0ZSBjb2x1bW4gImNsdXN0LklEIiBhbmQgcG9wdWxhdGUgd2l0aCAwJ3MuIFRoZW4gaW1wb3J0IElEcyBmb3IgY2x1c3RlcnMKCgoKYGBge3J9CmNsdXN0My5jZWxscyA8LSByZWFkLnRhYmxlKGZpbGUgPSAiLi4vU2V1cmF0djFfY2x1c3RlckNlbGxJRHMvY2x1c3RlcjNjZWxsSURzLnR4dCIsIGNvbC5uYW1lcyA9ICJjbHVzdDAzIikKY2x1c3QzLmNlbGxzIDwtIHNhcHBseShjbHVzdDMuY2VsbHMsIGZ1bmN0aW9uKHgpIHBhc3RlMChnc3ViKCJDTVAiLCAiQ01QbTIiLCB4KSwgIi0xIikpCmNsdXN0MTcuY2VsbHMgPC0gcmVhZC50YWJsZShmaWxlID0gIi4uL1NldXJhdHYxX2NsdXN0ZXJDZWxsSURzL2NsdXN0ZXIxN2NlbGxJRHMudHh0IiwgY29sLm5hbWVzID0gImNsdXN0MTciKQpjbHVzdDE3LmNlbGxzIDwtIHNhcHBseShjbHVzdDE3LmNlbGxzLCBmdW5jdGlvbih4KSBwYXN0ZTAoZ3N1YigiQ01QIiwgIkNNUG0yIiwgeCksICItMSIpKQpjbHVzdDEwLmNlbGxzIDwtIHJlYWQudGFibGUoZmlsZSA9ICIuLi9TZXVyYXR2MV9jbHVzdGVyQ2VsbElEcy9jbHVzdGVyMTBjZWxsSURzLnR4dCIsIGNvbC5uYW1lcyA9ICJjbHVzdDEwIikKY2x1c3QxMC5jZWxscyA8LSBzYXBwbHkoY2x1c3QxMC5jZWxscywgZnVuY3Rpb24oeCkgcGFzdGUwKGdzdWIoIkNNUCIsICJDTVBtMiIsIHgpLCAiLTEiKSkKY2x1c3QxMS5jZWxscyA8LSByZWFkLnRhYmxlKGZpbGUgPSAiLi4vU2V1cmF0djFfY2x1c3RlckNlbGxJRHMvY2x1c3RlcjExY2VsbElEcy50eHQiLCBjb2wubmFtZXMgPSAiY2x1c3QxMSIpCmNsdXN0MTEuY2VsbHMgPC0gc2FwcGx5KGNsdXN0MTEuY2VsbHMsIGZ1bmN0aW9uKHgpIHBhc3RlMChnc3ViKCJDTVAiLCAiQ01QbTIiLCB4KSwgIi0xIikpCmBgYAoKQWRkIG5ldyBtZXRhZGF0YSBjb2x1bW4KYGBge3J9CmNtcC5vYmplY3RAbWV0YS5kYXRhWydjbHVzdC5JRCddIDwtIDAKaGVhZChjbXAub2JqZWN0QG1ldGEuZGF0YSkKYGBgCgpub3cgbWFwIG5ldyBpZHMKYGBge3J9CmNtcC5vYmplY3RAbWV0YS5kYXRhJGNsdXN0LklEW3Jvd25hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSAlaW4lIGNsdXN0My5jZWxsc10gPC0gMwpjbXAub2JqZWN0QG1ldGEuZGF0YSRjbHVzdC5JRFtyb3duYW1lcyhjbXAub2JqZWN0QG1ldGEuZGF0YSkgJWluJSBjbHVzdDE3LmNlbGxzXSA8LSAxNwpjbXAub2JqZWN0QG1ldGEuZGF0YSRjbHVzdC5JRFtyb3duYW1lcyhjbXAub2JqZWN0QG1ldGEuZGF0YSkgJWluJSBjbHVzdDEwLmNlbGxzXSA8LSAxMApjbXAub2JqZWN0QG1ldGEuZGF0YSRjbHVzdC5JRFtyb3duYW1lcyhjbXAub2JqZWN0QG1ldGEuZGF0YSkgJWluJSBjbHVzdDExLmNlbGxzXSA8LSAxMQpgYGAKCmRvIG51bWJlcnMgbWFrZSBzZW5zZT8KYGBge3J9Cm5yb3coY21wLm9iamVjdEBtZXRhLmRhdGFbY21wLm9iamVjdEBtZXRhLmRhdGEkY2x1c3QuSUQgPT0gMTAsXSkKbnJvdyhjbXAub2JqZWN0QG1ldGEuZGF0YVtjbXAub2JqZWN0QG1ldGEuZGF0YSRjbHVzdC5JRCA9PSAxMSxdKQpucm93KGNtcC5vYmplY3RAbWV0YS5kYXRhW2NtcC5vYmplY3RAbWV0YS5kYXRhJGNsdXN0LklEID09IDE3LF0pCm5yb3coY21wLm9iamVjdEBtZXRhLmRhdGFbY21wLm9iamVjdEBtZXRhLmRhdGEkY2x1c3QuSUQgPT0gMyxdKQpgYGAKCgoKCgoKCgojIFRvdGFsIHZhciA5MCUKIyMgTmVpZ2hib3Job29kIGFuZCB1bWFwCnNldCB0b3RhbC52YXIgPC0gOTAlCmBgYHtyfQp0b3QudmFyIDwtIHBlcmNlbnQudmFyaWFuY2UoY21wLm9iamVjdEByZWR1Y3Rpb25zJHBjYUBzdGRldiwgcGxvdC52YXIgPSBGQUxTRSwgcmV0dXJuLnZhbCA9IFRSVUUpCm5kaW1zIDwtIGxlbmd0aCh3aGljaChjdW1zdW0odG90LnZhcikgPD0gOTApKQoKY21wLm9iamVjdCA8LSBGaW5kTmVpZ2hib3JzKGNtcC5vYmplY3QsIGRpbXMgPSAxOm5kaW1zKQpjbXAub2JqZWN0IDwtIEZpbmRDbHVzdGVycyhjbXAub2JqZWN0LCByZXNvbHV0aW9uID0gMC41KQpjbXAub2JqZWN0IDwtIFJ1blVNQVAoY21wLm9iamVjdCwgZGltcyA9IDE6IG5kaW1zKQoKYGBgClBsb3QgVU1BUAoKYGBge3J9CmZvcih4IGluIGMoMC41LCAxLCAxLjUsIDIsIDIuNSkpewoJY21wLm9iamVjdCA8LSBGaW5kQ2x1c3RlcnMoY21wLm9iamVjdCwgcmVzb2x1dGlvbiA9IHgpCn0Kc2F2ZVJEUyhjbXAub2JqZWN0LCBmaWxlID0gcGFzdGUwKHByb2plY3ROYW1lLCAiX2RpbSIsIG5kaW1zLCAiLlJEUyIpKQpgYGAKCmBgYHtyfQpmb3IgKG1ldGEuY29sIGluIGNvbG5hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSl7CglpZihncmVwbChwYXR0ZXJuID0gKCJSTkFfc25uX3JlcyIpLCB4ID0gbWV0YS5jb2wpPT1UUlVFKXsKCQlteXBsb3QgPC0gRGltUGxvdChjbXAub2JqZWN0LCAKCQkJCQkJCQkJCQlncm91cC5ieSA9IG1ldGEuY29sLAoJCQkJCQkJCQkJCXJlZHVjdGlvbiA9ICJ1bWFwIiwgCgkJCQkJCQkJCQkJY29scyA9IGNvbG9yLnBhbGV0dGUKCQkJCQkJCQkJCQkpICsgCgkJCWdndGl0bGUocGFzdGUwKHByb2plY3ROYW1lLCAiIGRpbSIsIG5kaW1zLCAicmVzIiwgZ3N1YigiUk5BX3Nubl9yZXMiLCAiIiwgbWV0YS5jb2wpICkpCgkJcGxvdChteXBsb3QpCgl9Cn0KYGBgCgojIyMgQ2x1c3RyZWUKd2hhdCdzIHRoZSBtYXggcmVzb2x1dGlvbiB3ZSBjYW4gYWNoaWV2ZSB3aGlsZSBrZWVwaWduIGNsdXN0ZXJzIHN0YWJsZT8KYGBge3IgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA1fQpwbG90LnRpdGxlIDwtIHBhc3RlMChwcm9qZWN0TmFtZSwgIl9jbHVzdHJlZV9uZGltIiwgbWF4KGNtcC5vYmplY3RAY29tbWFuZHMkUnVuVU1BUC5STkEucGNhJGRpbXMpKQpteS5jbHVzdHJlZSA8LSBjbHVzdHJlZShjbXAub2JqZWN0LCBwcmVmaXggPSAiUk5BX3Nubl9yZXMuIiwgbm9kZV9jb2xvdXIgPSAic2MzX3N0YWJpbGl0eSIsIGV4cHJzID0gInNjYWxlLmRhdGEiKSArIAoJc2NhbGVfY29sb3JfY29udGludW91cyhsb3cgPSAncmVkMycsIGhpZ2ggPSAnd2hpdGUnKSArIAoJZ2d0aXRsZShwbG90LnRpdGxlKQpwbmcoZmlsZW5hbWUgPSBwYXN0ZTAocGxvdC50aXRsZSwgIi5wbmciKSwgaGVpZ2h0ID0gODAwLCB3aWR0aCA9IDE2MDApCnBsb3QobXkuY2x1c3RyZWUpCmRldi5vZmYoKQoKYGBgCkkgdGhpbmsgSSdtIGxpa2luZyByZXMuMS4wIGZyb20gdGhpcy4gQWx0aG91Z2ggaG93IG11Y2ggZG9lcyB0aGlzIGNoYW5nZSBpZiBJIHVzZSBmZXdlciBQQ3MuLi4KCgoKZm9yIGVhY2ggcmVzb2x1dGlvbiwgbnVtYmVyL3BlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gZWFjaCBjbHVzdGVyPwoKYGBge3J9CnRvdC5jZWxscyA8LSBucm93KGNtcC5vYmplY3RAbWV0YS5kYXRhKQpmb3IgKG1ldGEuY29sIGluIGNvbG5hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSl7CglpZihncmVwbChwYXR0ZXJuID0gKCJSTkFfc25uX3JlcyIpLCB4ID0gbWV0YS5jb2wpPT1UUlVFKXsKCQluZXcuY2x1c3RlcnMgPC0gc29ydChhcy5udW1lcmljKGxldmVscyhjbXAub2JqZWN0QG1ldGEuZGF0YVtbbWV0YS5jb2xdXSkpKQoJCXN0YXRzLmRmIDwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSAyLCBucm93ID0gbGVuZ3RoKG5ldy5jbHVzdGVycykpKQoJCWNvbG5hbWVzKHN0YXRzLmRmKSA8LSBjKCJudW1fY2VsbHMiLCAicGN0X3BvcCIpCgkJcm93bmFtZXMoc3RhdHMuZGYpIDwtIG5ldy5jbHVzdGVycwoJCW1ldGEuZGYgPC0gY21wLm9iamVjdEBtZXRhLmRhdGEKCQlmb3Iocm93LmlkIGluIHJvd25hbWVzKHN0YXRzLmRmKSl7CgkJCQludW0ueCA8LSBucm93KG1ldGEuZGZbbWV0YS5kZlttZXRhLmNvbF0gPT0gcm93LmlkLF0pCgkJCQlwY3QueCA8LSBhcy5pbnRlZ2VyKG51bS54IC8gdG90LmNlbGxzICoxMDApCgkJCQkjIHByaW50KHBjdC54KQoJCQkJc3RhdHMuZGZbcm93LmlkLCAibnVtX2NlbGxzIl0gPC0gbnVtLngKCQkJCXN0YXRzLmRmW3Jvdy5pZCwgInBjdF9wb3AiXSA8LSBwY3QueAoJCX0KCQlwcmludChzdGF0cy5kZikKCX0KfQpgYGAKCgoKRm9yIGVhY2ggcmVzb2x1dGlvbiwgd2hhdCBwZXJjZW50YWdlIG9mIGNlbGxzIGluIGVhY2ggY2x1c3RlciBhcmUgZW5yaWNoZWQgZm9yIG9uZSBvZiBvdXIgY2x1c3QuSURzPwoKClRlc3Q6IHdoYXQgcGVyY2VudGFnZSBvZiBlYWNoIG5ldyBjbHVzdGVySUQgbWF0Y2hlcyBvbmUgb2YgdGhlIG9sZGVyIGNsdXN0ZXJzPwpgYGB7cn0KZm9yIChtZXRhLmNvbCBpbiBjb2xuYW1lcyhjbXAub2JqZWN0QG1ldGEuZGF0YSkpewoJaWYoZ3JlcGwocGF0dGVybiA9ICgiUk5BX3Nubl9yZXMiKSwgeCA9IG1ldGEuY29sKT09VFJVRSl7CgkJbmV3LmNsdXN0ZXJzIDwtIHNvcnQoYXMubnVtZXJpYyhsZXZlbHMoY21wLm9iamVjdEBtZXRhLmRhdGFbW21ldGEuY29sXV0pKSkKCQllbnJpY2guZGYgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IDQsIG5yb3cgPSBsZW5ndGgobmV3LmNsdXN0ZXJzKSkpCgkJY29sbmFtZXMoZW5yaWNoLmRmKSA8LSBjKDMsIDE3LCAxMCwgMTEpCgkJcm93bmFtZXMoZW5yaWNoLmRmKSA8LSBuZXcuY2x1c3RlcnMKCQltZXRhLmRmIDwtIGNtcC5vYmplY3RAbWV0YS5kYXRhCgkJZm9yKHJvdy5pZCBpbiByb3duYW1lcyhlbnJpY2guZGYpKXsKCQkJdG90LmNsdXMgPC0gbnJvdyhtZXRhLmRmW21ldGEuZGZbW21ldGEuY29sXV0gPT0gcm93LmlkLF0pCgkJCWZvcihjb2wuaWQgaW4gY29sbmFtZXMoZW5yaWNoLmRmKSl7CgkJCQludW0ueCA8LSBucm93KG1ldGEuZGZbKG1ldGEuZGZbW21ldGEuY29sXV0gPT0gcm93LmlkKSAmIChtZXRhLmRmJGNsdXN0LklEID09IGNvbC5pZCksXSkKCQkJCXBjdC54IDwtIGFzLmludGVnZXIobnVtLnggLyB0b3QuY2x1cyAqMTAwKQoJCQkJIyBwcmludChwY3QueCkKCQkJCWVucmljaC5kZltyb3cuaWQsIGNvbC5pZF0gPC0gcGN0LngKCQkJfQoJCX0KCQljb2xuYW1lcyhlbnJpY2guZGYpIDwtIHNhcHBseShjb2xuYW1lcyhlbnJpY2guZGYpLCBmdW5jdGlvbih4KSBwYXN0ZTAoIm9sZGNsdXN0ZXIiLCB4KSkKCQlyb3duYW1lcyhlbnJpY2guZGYpIDwtIHNhcHBseShyb3duYW1lcyhlbnJpY2guZGYpLCBmdW5jdGlvbih4KSBwYXN0ZTAoIm5ld2NsdXN0ZXIiLCB4KSkKCQl4bHN4Ojp3cml0ZS54bHN4KGVucmljaC5kZiwgZmlsZSA9IHBhc3RlMCgiUGN0T2ZOZXdDbHVzdGVyc092ZXJsYXBwaW5nT2xkQ2x1c3RlcnNfIiwgcHJvamVjdE5hbWUsICJfZGltIiwgbmRpbXMsICIueGxzeCIpLCBzaGVldE5hbWUgPSBwYXN0ZTAoZ3N1YigiUk5BX3Nubl8iLCAiIiwgbWV0YS5jb2wpKSwgYXBwZW5kID0gVFJVRSkKCQlwcmludChlbnJpY2guZGYpCgl9Cn0KCmBgYApBYnNvbHV0ZWx5IHRlcnJpYmxlIG92ZXJsYXAsIG5vIGVucmljaG1lbnQgb2YgYW55IG9mIHRoZXNlIGFjcm9zcyB0aGUgbmV3IGNsdXN0ZXJpbmcgYWxnb3JpdGhtLiBNYXliZSBzaG91bGQgdHJ5IDk1JSB2YXJpYXRpb24gY292ZXJlZAoKIyMgRmluZCBvbGQgY2VsbHMgb24gVU1BUAoKdGltZSBmb3IgdGhlIHN1cGVyIHNjYXJleSBtb21lbnQgdG8gc2VlIGlmIHRoZSBjZWxscyBmcm9tIHNldXJhdHYxIHN0aWxsIGNsdXN0ZXIgdG9nZXRoZXIgb24gaW4gc2V1cmF0IHY0CgpgYGB7ciBmaWcud2lkdGggPSA0fQpEaW1QbG90KGNtcC5vYmplY3QsCgkJCQlyZWR1Y3Rpb24gPSAidW1hcCIsCgkJCQlncm91cC5ieSA9ICJjbHVzdC5JRCIsIAoJCQkJIyBzcGxpdC5ieSA9ICJvcmlnLmlkZW50IiwKCQkJCWNvbHMgPSBjKCJncmF5IiwgIm9yYW5nZSIsICJibHVlIiwgInJlZCIsICJncmVlbiIpLCkKYGBgCmBgYHtyIGZpZy53aWR0aCA9IDR9CkRpbVBsb3QoY21wLm9iamVjdCwKCQkJCXJlZHVjdGlvbiA9ICJ1bWFwIiwKCQkJCWdyb3VwLmJ5ID0gIm9yaWcuaWRlbnQiLCAKCQkJCXNwbGl0LmJ5ID0gImNsdXN0LklEIiwKCQkJCWNvbHMgPSBjKCJncmF5IiwgIm9yYW5nZSIsICJibHVlIiwgInJlZCIsICJncmVlbiIpLCkKYGBgCgoKIyBUb3RhbCB2YXIgODUlCiMjIE5laWdoYm9yaG9vZCBhbmQgdW1hcApzZXQgdG90YWwudmFyIDwtIDg1JQpgYGB7cn0KdG90LnZhciA8LSBwZXJjZW50LnZhcmlhbmNlKGNtcC5vYmplY3RAcmVkdWN0aW9ucyRwY2FAc3RkZXYsIHBsb3QudmFyID0gRkFMU0UsIHJldHVybi52YWwgPSBUUlVFKQpuZGltcyA8LSBsZW5ndGgod2hpY2goY3Vtc3VtKHRvdC52YXIpIDw9IDg1KSkKYGBgCgpgYGB7cn0KY21wLm9iamVjdCA8LSBGaW5kTmVpZ2hib3JzKGNtcC5vYmplY3QsIGRpbXMgPSAxOm5kaW1zKQpjbXAub2JqZWN0IDwtIEZpbmRDbHVzdGVycyhjbXAub2JqZWN0LCByZXNvbHV0aW9uID0gMC41KQpjbXAub2JqZWN0IDwtIFJ1blVNQVAoY21wLm9iamVjdCwgZGltcyA9IDE6IG5kaW1zKQpgYGAKUGxvdCBVTUFQCgpgYGB7cn0KZm9yKHggaW4gYygwLjUsIDEsIDEuNSwgMiwgMi41KSl7CgljbXAub2JqZWN0IDwtIEZpbmRDbHVzdGVycyhjbXAub2JqZWN0LCByZXNvbHV0aW9uID0geCkKc2F2ZVJEUyhjbXAub2JqZWN0LCBmaWxlID0gcGFzdGUwKHByb2plY3ROYW1lLCAiX2RpbSIsIG5kaW1zLCAiLlJEUyIpKQp9CmBgYAoKYGBge3J9CmZvciAobWV0YS5jb2wgaW4gY29sbmFtZXMoY21wLm9iamVjdEBtZXRhLmRhdGEpKXsKCWlmKGdyZXBsKHBhdHRlcm4gPSAoIlJOQV9zbm5fcmVzIiksIHggPSBtZXRhLmNvbCk9PVRSVUUpewoJCXBsb3QudGl0bGUgPC0gcGFzdGUwKHByb2plY3ROYW1lLCAiZGltIiwgbmRpbXMsICJyZXMiLCBnc3ViKCJSTkFfc25uX3JlcyIsICIiLCBtZXRhLmNvbCkpCgkJbXlwbG90IDwtIERpbVBsb3QoY21wLm9iamVjdCwgCgkJCQkJCQkJCQkJZ3JvdXAuYnkgPSBtZXRhLmNvbCwKCQkJCQkJCQkJCQlyZWR1Y3Rpb24gPSAidW1hcCIsIAoJCQkJCQkJCQkJCWNvbHMgPSBjb2xvci5wYWxldHRlCgkJCQkJCQkJCQkJKSArIAoJCQlnZ3RpdGxlKHBsb3QudGl0bGUpCgkJcGxvdChteXBsb3QpCgkJcG5nKGZpbGVuYW1lID0gcGFzdGUwKHBsb3QudGl0bGUsICIucG5nIiksIGhlaWdodCA9IDgwMCwgd2lkdGggPSA4MDApCgkJcGxvdChEaW1QbG90KGNtcC5vYmplY3QsIAoJCQkJCQkJCQkJCWdyb3VwLmJ5ID0gbWV0YS5jb2wsCgkJCQkJCQkJCQkJcmVkdWN0aW9uID0gInVtYXAiLCAKCQkJCQkJCQkJCQljb2xzID0gY29sb3IucGFsZXR0ZSwgCgkJCQkJCQkJCQkJcHQuc2l6ZSA9IDEuNQoJCQkJCQkJCQkJCSkgKyAKCQkJZ2d0aXRsZShwbG90LnRpdGxlKQoJCQkpCgkJZGV2Lm9mZigpCgl9Cn0KYGBgCgojIyMgQ2x1c3RyZWUKd2hhdCdzIHRoZSBtYXggcmVzb2x1dGlvbiB3ZSBjYW4gYWNoaWV2ZSB3aGlsZSBrZWVwaWduIGNsdXN0ZXJzIHN0YWJsZT8KYGBge3IgZmlnLndpZHRoID0gMTUsIGZpZy5oZWlnaHQgPSA1fQpwbG90LnRpdGxlIDwtIHBhc3RlMChwcm9qZWN0TmFtZSwgIl9jbHVzdHJlZV9uZGltIiwgbWF4KGNtcC5vYmplY3RAY29tbWFuZHMkUnVuVU1BUC5STkEucGNhJGRpbXMpKQpteS5jbHVzdHJlZSA8LSBjbHVzdHJlZShjbXAub2JqZWN0LCBwcmVmaXggPSAiUk5BX3Nubl9yZXMuIiwgbm9kZV9jb2xvdXIgPSAic2MzX3N0YWJpbGl0eSIsIGV4cHJzID0gInNjYWxlLmRhdGEiKSArIAoJc2NhbGVfY29sb3JfY29udGludW91cyhsb3cgPSAncmVkMycsIGhpZ2ggPSAnd2hpdGUnKSArIAoJZ2d0aXRsZShwbG90LnRpdGxlKQpwbG90KG15LmNsdXN0cmVlKQpwbmcoZmlsZW5hbWUgPSBwYXN0ZTAocGxvdC50aXRsZSwgIi5wbmciKSwgaGVpZ2h0ID0gODAwLCB3aWR0aCA9IDE2MDApCnBsb3QobXkuY2x1c3RyZWUpCmRldi5vZmYoKQpgYGAKCgoKZm9yIGVhY2ggcmVzb2x1dGlvbiwgbnVtYmVyL3BlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gZWFjaCBjbHVzdGVyPwoKYGBge3J9CnRvdC5jZWxscyA8LSBucm93KGNtcC5vYmplY3RAbWV0YS5kYXRhKQpmb3IgKG1ldGEuY29sIGluIGNvbG5hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSl7CglpZihncmVwbChwYXR0ZXJuID0gKCJSTkFfc25uX3JlcyIpLCB4ID0gbWV0YS5jb2wpPT1UUlVFKXsKCQluZXcuY2x1c3RlcnMgPC0gc29ydChhcy5udW1lcmljKGxldmVscyhjbXAub2JqZWN0QG1ldGEuZGF0YVtbbWV0YS5jb2xdXSkpKQoJCXN0YXRzLmRmIDwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSAyLCBucm93ID0gbGVuZ3RoKG5ldy5jbHVzdGVycykpKQoJCWNvbG5hbWVzKHN0YXRzLmRmKSA8LSBjKCJudW1fY2VsbHMiLCAicGN0X3BvcCIpCgkJcm93bmFtZXMoc3RhdHMuZGYpIDwtIG5ldy5jbHVzdGVycwoJCW1ldGEuZGYgPC0gY21wLm9iamVjdEBtZXRhLmRhdGEKCQlmb3Iocm93LmlkIGluIHJvd25hbWVzKHN0YXRzLmRmKSl7CgkJCQludW0ueCA8LSBucm93KG1ldGEuZGZbbWV0YS5kZlttZXRhLmNvbF0gPT0gcm93LmlkLF0pCgkJCQlwY3QueCA8LSBhcy5pbnRlZ2VyKG51bS54IC8gdG90LmNlbGxzICoxMDApCgkJCQkjIHByaW50KHBjdC54KQoJCQkJc3RhdHMuZGZbcm93LmlkLCAibnVtX2NlbGxzIl0gPC0gbnVtLngKCQkJCXN0YXRzLmRmW3Jvdy5pZCwgInBjdF9wb3AiXSA8LSBwY3QueAoJCX0KCQlwcmludChzdGF0cy5kZikKCX0KfQpgYGAKCiMjIElkZW50aWZ5IHZhcmlhYmxlIGdlbmVzIGZvciBuZXcgYmlvbWFyawpgYGB7cn0KbGVuZ3RoKGNtcC5vYmplY3RAYXNzYXlzJFJOQUB2YXIuZmVhdHVyZXMpCmBgYAoKCgoKCiMjIyBHZW5lIHByb2ZpbGVzIG9mIGNsdXN0ZXJzCnNldCBpZGVudCBhdCByZXMgPSAxIGFuZCBnZXQgbWFya2VycwpgYGB7cn0KSWRlbnRzKGNtcC5vYmplY3QpIDwtICJSTkFfc25uX3Jlcy4xIgpgYGAKCmBgYHtyfQpjbXAuYWxsbWFya2Vycy5yZXMxIDwtIEZpbmRBbGxNYXJrZXJzKGNtcC5vYmplY3QpCmNtcC50b3AxMDBtYXJrZXJzLnJlczEgPC0gY21wLmFsbG1hcmtlcnMucmVzMSAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIHRvcF9uKG4gPSAxMDAsIHd0ID0gYWJzKGF2Z19sb2cyRkMpKQpgYGAKCmBgYHtyfQpjbXAudG9wMTAwbWFya2Vycy5yZXMxIDwtIGNtcC5hbGxtYXJrZXJzLnJlczEgJT4lIGdyb3VwX2J5KGNsdXN0ZXIpICU+JSB0b3BfbihuID0gMTAwLCB3dCA9IGFicyhhdmdfbG9nMkZDKSkKY21wLnRvcDEwMG1hcmtlcnMucmVzMSA8LSBjbXAudG9wMTAwbWFya2Vycy5yZXMxW2NtcC50b3AxMDBtYXJrZXJzLnJlczEkcF92YWxfYWRqIDw9IDAuMDUsIF0KZm9yKGNsdXN0ZXIgaW4gc29ydChhcy5udW1lcmljKHVuaXF1ZShjbXAudG9wMTAwbWFya2Vycy5yZXMxJGNsdXN0ZXIpKSkpewoJbnVtLmhpdHMgPC0gbnJvdyhjbXAudG9wMTAwbWFya2Vycy5yZXMxW2NtcC50b3AxMDBtYXJrZXJzLnJlczEkY2x1c3RlciA9PSBjbHVzdGVyLCBdKQoJcHJpbnQocGFzdGUoImNsdXN0ZXIiLCBjbHVzdGVyLCAiaGFzIiwgbnVtLmhpdHMsICJnZW5lcyIpKQoJCWNsdXN0ZXIubWFya2VycyA8LSBGaW5kTWFya2VycyhjbXAub2JqZWN0LCBpZGVudC4xID0gY2x1c3RlcikKCQl0cnkoCgkJCXhsc3g6OndyaXRlLnhsc3goeCA9IGNsdXN0ZXIubWFya2Vyc1ssYygiYXZnX2xvZzJGQyIsICJwX3ZhbF9hZGoiKV0sIAoJCQkJCQkJCQkJCSBmaWxlID0gcGFzdGUwKHByb2plY3ROYW1lLCAiX2RpbSIsIG5kaW1zLCAiX0ZpbmRNYXJrZXJzVG9wMTAwLnhsc3giKSwgCgkJCQkJCQkJCQkJIHNoZWV0TmFtZSA9IHBhc3RlMCgiY2xzdCIsIGNsdXN0ZXIpLCAKCQkJCQkJCQkJCQkgY29sLm5hbWVzID0gVFJVRSwgCgkJCQkJCQkJCQkJIHJvdy5uYW1lcyA9IFRSVUUsIAoJCQkJCQkJCQkJCSBhcHBlbmQgPSBUUlVFKQoJCSkJCgl9CmBgYAoKCkZpbmQgdG9wLnZhcglnZW5lcyBpbiBjbXAudG9wMTAwbWFya2Vycy5yZXMxCmBgYHtyfQp0b3AudmFyIDwtIGNtcC5vYmplY3RAYXNzYXlzJFJOQUB2YXIuZmVhdHVyZXNbMToxNTBdCiMgdG9wLnZhcgpuLnZhcmdlbmVzIDwtIGMoKQpmb3IoZ2VuZSBpbiB0b3AudmFyKXsKCWlmKGdlbmUgJWluJSBjbXAudG9wMTAwbWFya2Vycy5yZXMxJGdlbmUpewoJCW4udmFyZ2VuZXMgPC0gYyhuLnZhcmdlbmVzLCBnZW5lKQoJfQp9CnByaW50KGxlbmd0aChuLnZhcmdlbmVzKSkKdG9wLnZhclshKHRvcC52YXIgJWluJSBuLnZhcmdlbmVzKV0KYGBgCgoKTGV0cyB0cnkgdG8gZXhwb3J0IHRoZXNlLCB3aXRoIGdlbmVzIG9uIHJvd3MgYW5kIGNsdXN0ZXJzIG9uIGNvbHVtbnMsIGFuZCB4cHJlc3Npb24gdmFsdWUgaW4gZGF0YSB0YWJsZQpgYGB7cn0KdmFyLmRmIDwtIGNtcC50b3AxMDBtYXJrZXJzLnJlczFbY21wLnRvcDEwMG1hcmtlcnMucmVzMSRnZW5lICVpbiUgbi52YXJnZW5lcyxdCnZhci5kZiA8LSBzdWJzZXQuZGF0YS5mcmFtZSh2YXIuZGYsIHNlbGVjdCA9IGMoImdlbmUiLCAiY2x1c3RlciIsICJhdmdfbG9nMkZDIikpCnZhci5kZiA8LSByZXNoYXBlMjo6ZGNhc3QodmFyLmRmLCBnZW5lfmNsdXN0ZXIsIHZhbHVlLnZhciA9ICJhdmdfbG9nMkZDIikKeGxzeDo6d3JpdGUueGxzeCh2YXIuZGYsIGZpbGUgPSBwYXN0ZTAocHJvamVjdE5hbWUsICJfZGltIiwgbmRpbXMsICJfY2FuZGlkaWRhdGVCaW9tYXJrR2VuZXMueGxzeCIpLCBzaGVldE5hbWUgPSAicmVzMSIsIGFwcGVuZCA9IFRSVUUsIHJvdy5uYW1lcyA9IEZBTFNFKQoKYGBgCgpIZXJlJ3MgdGhlIGxpc3Qgb2YgZ2VuZXMsIHBsdXMgc29tZSBjb250cm9scwpgYGB7cn0KcmVzMS5iaW9tYXJrLmdlbmVzIDwtIGMoIkFpZjEiLAoJCQkJCQkJCQkJCQkiQXFwMSIsCgkJCQkJCQkJCQkJCSJCaXJjNSIsCgkJCQkJCQkJCQkJCSJDY2wzIiwKCQkJCQkJCQkJCQkJIkNjcjIiLAoJCQkJCQkJCQkJCQkiQ2Q3NCIsCgkJCQkJCQkJCQkJCSJDZGMyMCIsCgkJCQkJCQkJCQkJCSJDZW5wZiIsCgkJCQkJCQkJCQkJCSJDc3QzIiwKCQkJCQkJCQkJCQkJIkN0c2giLAoJCQkJCQkJCQkJCQkiRG50dCIsCgkJCQkJCQkJCQkJCSJFbGFuZSIsCgkJCQkJCQkJCQkJCSJFcm1hcCIsCgkJCQkJCQkJCQkJCSJGMTNhMSIsCgkJCQkJCQkJCQkJCSJGY2VyMWciLAoJCQkJCQkJCQkJCQkiR20xNTkxNSIsCgkJCQkJCQkJCQkJCSJHbTE3NTkwIiwKCQkJCQkJCQkJCQkJIkgyLUFhIiwKCQkJCQkJCQkJCQkJIkgyLUViMSIsCgkJCQkJCQkJCQkJCSJIMmFmeCIsCgkJCQkJCQkJCQkJCSJIMmFmeSIsCgkJCQkJCQkJCQkJCSJIaXN0MWgyYWMiLAoJCQkJCQkJCQkJCQkiSG1nYjIiLAoJCQkJCQkJCQkJCQkiSHAiLAoJCQkJCQkJCQkJCQkiSWdobSIsCgkJCQkJCQkJCQkJCSJJcmY4IiwKCQkJCQkJCQkJCQkJIkxnYWxzMyIsCgkJCQkJCQkJCQkJCSJMbW80IiwKCQkJCQkJCQkJCQkJIk1zNGEyIiwKCQkJCQkJCQkJCQkJIk10MSIsCgkJCQkJCQkJCQkJCSJQbGFjOCIsCgkJCQkJCQkJCQkJCSJQcnRuMyIsCgkJCQkJCQkJCQkJCSJSYXAxYiIsCgkJCQkJCQkJCQkJCSJSZ3MxIiwKCQkJCQkJCQkJCQkJIlZ3ZiIsCgkJCQkJCQkJCQkJCSJXZmRjMTciLAoJCQkJCQkJCQkJCQkiQ3NycDMiLAoJCQkJCQkJCQkJCQkiSGlzdDFoMmFlIiwKCQkJCQkJCQkJCQkJIklmaXRtMSIsCgkJCQkJCQkJCQkJCSJMZ2FsczEiLAoJCQkJCQkJCQkJCQkiVG1zYjR4IiwKCQkJCQkJCQkJCQkJIkFybDZpcDEiLAoJCQkJCQkJCQkJCQkiQ2FyMiIsCgkJCQkJCQkJCQkJCSJDY2w5IiwKCQkJCQkJCQkJCQkJIkNjbmIyIiwKCQkJCQkJCQkJCQkJIkNkOSIsCgkJCQkJCQkJCQkJCSJDZW5wYSIsCgkJCQkJCQkJCQkJCSJDcGEzIiwKCQkJCQkJCQkJCQkJIkZvcyIsCgkJCQkJCQkJCQkJCSJIaXN0MWgyYXAiLAoJCQkJCQkJCQkJCQkiTHk2YzIiLAoJCQkJCQkJCQkJCQkiTXBvIiwKCQkJCQkJCQkJCQkJIlBjbGFmIiwKCQkJCQkJCQkJCQkJIlNscGkiLAoJCQkJCQkJCQkJCQkiVG9wMmEiLAoJCQkJCQkJCQkJCQkiVWJlMmMiLAoJCQkJCQkJCQkJCQkiTHk4NiIsCgkJCQkJCQkJCQkJCSJIaXN0MWgyYmMiLAoJCQkJCQkJCQkJCQkiUGY0IiwKCQkJCQkJCQkJCQkJIkFwb2UiLAoJCQkJCQkJCQkJCQkiQ3RzZyIsCgkJCQkJCQkJCQkJCSJDYXIxIiwKCQkJCQkJCQkJCQkJIkhtbXIiKQpoa2dlbmVzIDwtIGMoIkdhcGRoIiwgIkIybSIsICJIcHJ0IiwgIlBnazEiLCAiUnBscDIiLCAiUGdrMSIsICJVYmMiLCAiWXdoYXoiLCAiUHBpYSIsICJQdW0xIiwgIlBzbWM0IiwgIkVsZjEiLCAiTXJwbDE5IikKc3VyZmFjZS5tYXJrZXJzPC0gYygiQ2QzNCIsIAoJCQkJCQkJCQkJIktpdCIsCgkJCQkJCQkJCQkiQ2Q0OCIsIAoJCQkJCQkJCQkJIkx5NmEiLAoJCQkJCQkJCQkJIkx5NmUiLAoJCQkJCQkJCQkJIkNkOSIsCgkJCQkJCQkJCQkiSXRnYTJiIiwKCQkJCQkJCQkJCSJMeTg2IiwKCQkJCQkJCQkJCSJJdGdhNiIsCgkJCQkJCQkJCQkiQ2Q1NSIsCgkJCQkJCQkJCQkiU2xhbWYxIiwKCQkJCQkJCQkJCSJGbHQzIgoJCQkJCQkJCQkJKQpgYGAKCm1ha2UgdmxuIHBsb3RzIHBlciBjbHVzdGVyCmBgYHtyfQpmb3IoZ2VuZSBpbiByZXMxLmJpb21hcmsuZ2VuZXMpewoJcGxvdC50aXRsZSA8LSBwYXN0ZTAocHJvamVjdE5hbWUsICJkaW0iLCBuZGltcywgInJlczFfIiwgZ2VuZSkKCW15cGxvdDwtIFZsblBsb3QoY21wLm9iamVjdCwgZmVhdHVyZXMgPSBnZW5lLCBwdC5zaXplID0gMC4wMSkgKyBnZ3RpdGxlKHBsb3QudGl0bGUpCglwbmcoZmlsZW5hbWUgPSBwYXN0ZTAoIlZsblBsb3RzLyIsIHBsb3QudGl0bGUsICIucG5nIiksIGhlaWdodCA9IDgwMCwgd2lkdGggPSAxNjAwKQoJcGxvdChteXBsb3QpCglkZXYub2ZmKCkKfQpmb3IoZ2VuZSBpbiBoa2dlbmVzKXsKCXBsb3QudGl0bGUgPC0gcGFzdGUwKHByb2plY3ROYW1lLCAiZGltIiwgbmRpbXMsICJyZXMxXyIsIGdlbmUpCglteXBsb3Q8LSBWbG5QbG90KGNtcC5vYmplY3QsIGZlYXR1cmVzID0gZ2VuZSwgcHQuc2l6ZSA9IDAuMDEpICsgZ2d0aXRsZShwbG90LnRpdGxlKQoJcG5nKGZpbGVuYW1lID0gcGFzdGUwKCJWbG5QbG90cy8iLCBwbG90LnRpdGxlLCAiLWhrZ2VuZS5wbmciKSwgaGVpZ2h0ID0gODAwLCB3aWR0aCA9IDE2MDApCglwbG90KG15cGxvdCkKCWRldi5vZmYoKQp9CmZvcihnZW5lIGluIHN1cmZhY2UubWFya2Vycyl7CglwbG90LnRpdGxlIDwtIHBhc3RlMChwcm9qZWN0TmFtZSwgImRpbSIsIG5kaW1zLCAicmVzMV8iLCBnZW5lKQoJbXlwbG90PC0gVmxuUGxvdChjbXAub2JqZWN0LCBmZWF0dXJlcyA9IGdlbmUsIHB0LnNpemUgPSAwLjAxKSArIGdndGl0bGUocGxvdC50aXRsZSkKCXBuZyhmaWxlbmFtZSA9IHBhc3RlMCgiVmxuUGxvdHMvIiwgcGxvdC50aXRsZSwgIi1zdXJmTWtyLnBuZyIpLCBoZWlnaHQgPSA4MDAsIHdpZHRoID0gMTYwMCkKCXBsb3QobXlwbG90KQoJZGV2Lm9mZigpCn0KYGBgCgpQbG90IGNhbmRpZGF0ZSBjb250cm9sIGdlbmVzCmBgYHtyIGZpZy5oZWlnaHQ9MjAsIGZpZy53aWR0aD0xMH0KIyBWbG5QbG90KGNtcC5vYmplY3QsIGZlYXR1cmVzID0gaGtnZW5lcywgcHQuc2l6ZSA9IDAuMDAxLCBzYW1lLnkubGltcyA9IEZBTFNFLCBuY29sID0gMikKcG5nKGZpbGVuYW1lID0gcGFzdGUwKHByb2plY3ROYW1lLCAiZGltIiwgbmRpbXMsICJyZXMxX1RhcW1hbkNvbnRyb2xzLnBuZyIpLCBoZWlnaHQgPSAxNjAwLCB3aWR0aCA9IDI0MDApClZsblBsb3QoY21wLm9iamVjdCwgZmVhdHVyZXMgPSBoa2dlbmVzLCBwdC5zaXplID0gMC4wMSwgc2FtZS55LmxpbXMgPSBGQUxTRSwgbmNvbCA9IDUpCmRldi5vZmYoKQpgYGAKCgojIyBSZXMgMS41CgpyZXBlYXQgZm9yIHRvcC52YXIJZ2VuZXMgaW4gY21wLnRvcDEwMG1hcmtlcnMucmVzMS41CmBgYHtyfQp0b3AudmFyIDwtIGNtcC5vYmplY3RAYXNzYXlzJFJOQUB2YXIuZmVhdHVyZXNbMToxNTBdCklkZW50cyhjbXAub2JqZWN0KSA8LSAiUk5BX3Nubl9yZXMuMS41IgpjbXAuYWxsbWFya2Vycy5yZXMxLjUgPC0gRmluZEFsbE1hcmtlcnMoY21wLm9iamVjdCkKY21wLnRvcDEwMG1hcmtlcnMucmVzMS41IDwtIGNtcC5hbGxtYXJrZXJzLnJlczEuNSAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIHRvcF9uKG4gPSAxMDAsIHd0ID0gYWJzKGF2Z19sb2cyRkMpKQpuLnZhcmdlbmVzIDwtIGMoKQpmb3IoZ2VuZSBpbiB0b3AudmFyKXsKCWlmKGdlbmUgJWluJSBjbXAudG9wMTAwbWFya2Vycy5yZXMxLjUkZ2VuZSl7CgkJbi52YXJnZW5lcyA8LSBjKG4udmFyZ2VuZXMsIGdlbmUpCgl9Cn0KcHJpbnQobGVuZ3RoKG4udmFyZ2VuZXMpKQp0b3AudmFyWyEodG9wLnZhciAlaW4lIG4udmFyZ2VuZXMpXQpgYGAKCgpMZXRzIHRyeSB0byBleHBvcnQgdGhlc2UsIHdpdGggZ2VuZXMgb24gcm93cyBhbmQgY2x1c3RlcnMgb24gY29sdW1ucywgYW5kIHhwcmVzc2lvbiB2YWx1ZSBpbiBkYXRhIHRhYmxlCmBgYHtyfQp2YXIuZGYgPC0gY21wLnRvcDEwMG1hcmtlcnMucmVzMS41W2NtcC50b3AxMDBtYXJrZXJzLnJlczEuNSRnZW5lICVpbiUgbi52YXJnZW5lcyxdCnZhci5kZiA8LSBzdWJzZXQuZGF0YS5mcmFtZSh2YXIuZGYsIHNlbGVjdCA9IGMoImdlbmUiLCAiY2x1c3RlciIsICJhdmdfbG9nMkZDIikpCnZhci5kZiA8LSByZXNoYXBlMjo6ZGNhc3QodmFyLmRmLCBnZW5lfmNsdXN0ZXIpCnhsc3g6OndyaXRlLnhsc3godmFyLmRmLCBmaWxlID0gcGFzdGUwKHByb2plY3ROYW1lLCAiX2RpbSIsIG5kaW1zLCAiX2NhbmRpZGlkYXRlQmlvbWFya0dlbmVzLnhsc3giKSwgc2hlZXROYW1lID0gInJlczEuNSIsIGFwcGVuZCA9IFRSVUUsIHJvdy5uYW1lcyA9IEZBTFNFKQoKYGBgCkZvciBlYWNoIHJlc29sdXRpb24sIHdoYXQgcGVyY2VudGFnZSBvZiBjZWxscyBpbiBlYWNoIGNsdXN0ZXIgYXJlIGVucmljaGVkIGZvciBvbmUgb2Ygb3VyIGNsdXN0LklEcz8KCgpUZXN0OiB3aGF0IHBlcmNlbnRhZ2Ugb2YgZWFjaCBuZXcgY2x1c3RlcklEIG1hdGNoZXMgb25lIG9mIHRoZSBvbGRlciBjbHVzdGVycz8KYGBge3J9CmZvciAobWV0YS5jb2wgaW4gY29sbmFtZXMoY21wLm9iamVjdEBtZXRhLmRhdGEpKXsKCWlmKGdyZXBsKHBhdHRlcm4gPSAoIlJOQV9zbm5fcmVzIiksIHggPSBtZXRhLmNvbCk9PVRSVUUpewoJCW5ldy5jbHVzdGVycyA8LSBzb3J0KGFzLm51bWVyaWMobGV2ZWxzKGNtcC5vYmplY3RAbWV0YS5kYXRhW1ttZXRhLmNvbF1dKSkpCgkJZW5yaWNoLmRmIDwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSA0LCBucm93ID0gbGVuZ3RoKG5ldy5jbHVzdGVycykpKQoJCWNvbG5hbWVzKGVucmljaC5kZikgPC0gYygzLCAxNywgMTAsIDExKQoJCXJvd25hbWVzKGVucmljaC5kZikgPC0gbmV3LmNsdXN0ZXJzCgkJbWV0YS5kZiA8LSBjbXAub2JqZWN0QG1ldGEuZGF0YQoJCWZvcihyb3cuaWQgaW4gcm93bmFtZXMoZW5yaWNoLmRmKSl7CgkJCXRvdC5jbHVzIDwtIG5yb3cobWV0YS5kZlttZXRhLmRmW1ttZXRhLmNvbF1dID09IHJvdy5pZCxdKQoJCQlmb3IoY29sLmlkIGluIGNvbG5hbWVzKGVucmljaC5kZikpewoJCQkJbnVtLnggPC0gbnJvdyhtZXRhLmRmWyhtZXRhLmRmW1ttZXRhLmNvbF1dID09IHJvdy5pZCkgJiAobWV0YS5kZiRjbHVzdC5JRCA9PSBjb2wuaWQpLF0pCgkJCQlwY3QueCA8LSBhcy5pbnRlZ2VyKG51bS54IC8gdG90LmNsdXMgKjEwMCkKCQkJCSMgcHJpbnQocGN0LngpCgkJCQllbnJpY2guZGZbcm93LmlkLCBjb2wuaWRdIDwtIHBjdC54CgkJCX0KCQl9CgkJY29sbmFtZXMoZW5yaWNoLmRmKSA8LSBzYXBwbHkoY29sbmFtZXMoZW5yaWNoLmRmKSwgZnVuY3Rpb24oeCkgcGFzdGUwKCJvbGRjbHVzdGVyIiwgeCkpCgkJcm93bmFtZXMoZW5yaWNoLmRmKSA8LSBzYXBwbHkocm93bmFtZXMoZW5yaWNoLmRmKSwgZnVuY3Rpb24oeCkgcGFzdGUwKCJuZXdjbHVzdGVyIiwgeCkpCgkJeGxzeDo6d3JpdGUueGxzeChlbnJpY2guZGYsIGZpbGUgPSBwYXN0ZTAoIlBjdE9mTmV3Q2x1c3RlcnNPdmVybGFwcGluZ09sZENsdXN0ZXJzXyIsIHByb2plY3ROYW1lLCAiX2RpbSIsIG5kaW1zLCAiLnhsc3giKSwgc2hlZXROYW1lID0gcGFzdGUwKGdzdWIoIlJOQV9zbm5fIiwgIiIsIG1ldGEuY29sKSksIGFwcGVuZCA9IFRSVUUpCgkJcHJpbnQoZW5yaWNoLmRmKQoJfQp9CgpgYGAKQWJzb2x1dGVseSB0ZXJyaWJsZSBvdmVybGFwLCBubyBlbnJpY2htZW50IG9mIGFueSBvZiB0aGVzZSBhY3Jvc3MgdGhlIG5ldyBjbHVzdGVyaW5nIGFsZ29yaXRobS4gTWF5YmUgc2hvdWxkIHRyeSA5NSUgdmFyaWF0aW9uIGNvdmVyZWQKCiMjIEZpbmQgb2xkIGNlbGxzIG9uIFVNQVAKCnRpbWUgZm9yIHRoZSBzdXBlciBzY2FyZXkgbW9tZW50IHRvIHNlZSBpZiB0aGUgY2VsbHMgZnJvbSBzZXVyYXR2MSBzdGlsbCBjbHVzdGVyIHRvZ2V0aGVyIG9uIGluIHNldXJhdCB2NAoKYGBge3IgZmlnLndpZHRoID0gNH0KRGltUGxvdChjbXAub2JqZWN0LAoJCQkJcmVkdWN0aW9uID0gInVtYXAiLAoJCQkJZ3JvdXAuYnkgPSAiY2x1c3QuSUQiLCAKCQkJCSMgc3BsaXQuYnkgPSAib3JpZy5pZGVudCIsCgkJCQljb2xzID0gYygiZ3JheSIsICJvcmFuZ2UiLCAiYmx1ZSIsICJyZWQiLCAiZ3JlZW4iKSwpCmBgYApgYGB7ciBmaWcud2lkdGggPSA0fQpEaW1QbG90KGNtcC5vYmplY3QsCgkJCQlyZWR1Y3Rpb24gPSAidW1hcCIsCgkJCQlncm91cC5ieSA9ICJvcmlnLmlkZW50IiwgCgkJCQlzcGxpdC5ieSA9ICJjbHVzdC5JRCIsCgkJCQljb2xzID0gYygiZ3JheSIsICJvcmFuZ2UiLCAiYmx1ZSIsICJyZWQiLCAiZ3JlZW4iKSwpCmBgYAoKIyMjIEdlbmUgZXhwcmVzc2lvbiBvZiBvbGQgY2x1c3RycyBvbiBuZXcgbWFwCkxldCdzIHNlZSBpZiB3ZSBjYW4gZ2V0IHNvbWUgZ2VuZSBleHByZXNzaW9uIHByb2ZpbGVzIG9uIHRoZXNlLi4uCmBgYHtyLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTh9CmdlbmUubGlzdCA8LSBjKCJHYXRhMSIsICJHYXRhMiIsICJQZjQiLCAiRG50dCIsICJNcG8iLCAiTWVpczEiLCAiSXJmOCIsICJFbGFuZSIsICJGbGkxIiwgIlpmcG0xIikKVmxuUGxvdChjbXAub2JqZWN0LCBmZWF0dXJlcyA9IGdlbmUubGlzdCwgZ3JvdXAuYnkgPSAiY2x1c3QuSUQiLCBwdC5zaXplID0gMC4wMSwgY29scyA9IGMoImdyYXkiLCAib3JhbmdlIiwgImJsdWUiLCAicmVkIiwgImdyZWVuIikpCmBgYAoKCiMgVG90YWwgdmFyIDgwJQojIyBOZWlnaGJvcmhvb2QgYW5kIHVtYXAKc2V0IHRvdGFsLnZhciA8LSA4MCUKYGBge3J9CnRvdC52YXIgPC0gcGVyY2VudC52YXJpYW5jZShjbXAub2JqZWN0QHJlZHVjdGlvbnMkcGNhQHN0ZGV2LCBwbG90LnZhciA9IEZBTFNFLCByZXR1cm4udmFsID0gVFJVRSkKbmRpbXMgPC0gbGVuZ3RoKHdoaWNoKGN1bXN1bSh0b3QudmFyKSA8PSA4MCkpCgpjbXAub2JqZWN0IDwtIEZpbmROZWlnaGJvcnMoY21wLm9iamVjdCwgZGltcyA9IDE6bmRpbXMpCmNtcC5vYmplY3QgPC0gRmluZENsdXN0ZXJzKGNtcC5vYmplY3QsIHJlc29sdXRpb24gPSAwLjUpCmNtcC5vYmplY3QgPC0gUnVuVU1BUChjbXAub2JqZWN0LCBkaW1zID0gMTogbmRpbXMpCgpgYGAKUGxvdCBVTUFQCgpgYGB7cn0KZm9yKHggaW4gYygwLjUsIDEsIDEuNSwgMiwgMi41KSl7CgljbXAub2JqZWN0IDwtIEZpbmRDbHVzdGVycyhjbXAub2JqZWN0LCByZXNvbHV0aW9uID0geCkKc2F2ZVJEUyhjbXAub2JqZWN0LCBmaWxlID0gcGFzdGUwKHByb2plY3ROYW1lLCAiX2RpbSIsIG5kaW1zLCAiLlJEUyIpKQp9CmBgYAoKYGBge3J9CmZvciAobWV0YS5jb2wgaW4gY29sbmFtZXMoY21wLm9iamVjdEBtZXRhLmRhdGEpKXsKCWlmKGdyZXBsKHBhdHRlcm4gPSAoIlJOQV9zbm5fcmVzIiksIHggPSBtZXRhLmNvbCk9PVRSVUUpewoJCW15cGxvdCA8LSBEaW1QbG90KGNtcC5vYmplY3QsIAoJCQkJCQkJCQkJCWdyb3VwLmJ5ID0gbWV0YS5jb2wsCgkJCQkJCQkJCQkJcmVkdWN0aW9uID0gInVtYXAiLCAKCQkJCQkJCQkJCQljb2xzID0gY29sb3IucGFsZXR0ZQoJCQkJCQkJCQkJCSkgKyAKCQkJZ2d0aXRsZShwYXN0ZTAocHJvamVjdE5hbWUsICIgZGltIiwgbmRpbXMsICJyZXMiLCBnc3ViKCJSTkFfc25uX3JlcyIsICIiLCBtZXRhLmNvbCkgKSkKCQlwbG90KG15cGxvdCkKCX0KfQpgYGAKCiMjIyBDbHVzdHJlZQp3aGF0J3MgdGhlIG1heCByZXNvbHV0aW9uIHdlIGNhbiBhY2hpZXZlIHdoaWxlIGtlZXBpZ24gY2x1c3RlcnMgc3RhYmxlPwpgYGB7ciBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDV9CnBsb3QudGl0bGUgPC0gcGFzdGUwKHByb2plY3ROYW1lLCAiX2NsdXN0cmVlX25kaW0iLCBtYXgoY21wLm9iamVjdEBjb21tYW5kcyRSdW5VTUFQLlJOQS5wY2EkZGltcykpCm15LmNsdXN0cmVlIDwtIGNsdXN0cmVlKGNtcC5vYmplY3QsIHByZWZpeCA9ICJSTkFfc25uX3Jlcy4iLCBub2RlX2NvbG91ciA9ICJzYzNfc3RhYmlsaXR5IiwgZXhwcnMgPSAic2NhbGUuZGF0YSIpICsgCglzY2FsZV9jb2xvcl9jb250aW51b3VzKGxvdyA9ICdyZWQzJywgaGlnaCA9ICd3aGl0ZScpICsgCglnZ3RpdGxlKHBsb3QudGl0bGUpCnBuZyhmaWxlbmFtZSA9IHBhc3RlMChwbG90LnRpdGxlLCAiLnBuZyIpLCBoZWlnaHQgPSA4MDAsIHdpZHRoID0gMTYwMCkKcGxvdChteS5jbHVzdHJlZSkKZGV2Lm9mZigpCmBgYAoKCgpmb3IgZWFjaCByZXNvbHV0aW9uLCBudW1iZXIvcGVyY2VudGFnZSBvZiBjZWxscyBpbiBlYWNoIGNsdXN0ZXI/CgpgYGB7cn0KdG90LmNlbGxzIDwtIG5yb3coY21wLm9iamVjdEBtZXRhLmRhdGEpCmZvciAobWV0YS5jb2wgaW4gY29sbmFtZXMoY21wLm9iamVjdEBtZXRhLmRhdGEpKXsKCWlmKGdyZXBsKHBhdHRlcm4gPSAoIlJOQV9zbm5fcmVzIiksIHggPSBtZXRhLmNvbCk9PVRSVUUpewoJCW5ldy5jbHVzdGVycyA8LSBzb3J0KGFzLm51bWVyaWMobGV2ZWxzKGNtcC5vYmplY3RAbWV0YS5kYXRhW1ttZXRhLmNvbF1dKSkpCgkJc3RhdHMuZGYgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IDIsIG5yb3cgPSBsZW5ndGgobmV3LmNsdXN0ZXJzKSkpCgkJY29sbmFtZXMoc3RhdHMuZGYpIDwtIGMoIm51bV9jZWxscyIsICJwY3RfcG9wIikKCQlyb3duYW1lcyhzdGF0cy5kZikgPC0gbmV3LmNsdXN0ZXJzCgkJbWV0YS5kZiA8LSBjbXAub2JqZWN0QG1ldGEuZGF0YQoJCWZvcihyb3cuaWQgaW4gcm93bmFtZXMoc3RhdHMuZGYpKXsKCQkJCW51bS54IDwtIG5yb3cobWV0YS5kZlttZXRhLmRmW21ldGEuY29sXSA9PSByb3cuaWQsXSkKCQkJCXBjdC54IDwtIGFzLmludGVnZXIobnVtLnggLyB0b3QuY2VsbHMgKjEwMCkKCQkJCSMgcHJpbnQocGN0LngpCgkJCQlzdGF0cy5kZltyb3cuaWQsICJudW1fY2VsbHMiXSA8LSBudW0ueAoJCQkJc3RhdHMuZGZbcm93LmlkLCAicGN0X3BvcCJdIDwtIHBjdC54CgkJfQoJCXByaW50KHN0YXRzLmRmKQoJfQp9CmBgYAoKCgpGb3IgZWFjaCByZXNvbHV0aW9uLCB3aGF0IHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gZWFjaCBjbHVzdGVyIGFyZSBlbnJpY2hlZCBmb3Igb25lIG9mIG91ciBjbHVzdC5JRHM/CgoKVGVzdDogd2hhdCBwZXJjZW50YWdlIG9mIGVhY2ggbmV3IGNsdXN0ZXJJRCBtYXRjaGVzIG9uZSBvZiB0aGUgb2xkZXIgY2x1c3RlcnM/CmBgYHtyfQpmb3IgKG1ldGEuY29sIGluIGNvbG5hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSl7CglpZihncmVwbChwYXR0ZXJuID0gKCJSTkFfc25uX3JlcyIpLCB4ID0gbWV0YS5jb2wpPT1UUlVFKXsKCQluZXcuY2x1c3RlcnMgPC0gc29ydChhcy5udW1lcmljKGxldmVscyhjbXAub2JqZWN0QG1ldGEuZGF0YVtbbWV0YS5jb2xdXSkpKQoJCWVucmljaC5kZiA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gNCwgbnJvdyA9IGxlbmd0aChuZXcuY2x1c3RlcnMpKSkKCQljb2xuYW1lcyhlbnJpY2guZGYpIDwtIGMoMywgMTcsIDEwLCAxMSkKCQlyb3duYW1lcyhlbnJpY2guZGYpIDwtIG5ldy5jbHVzdGVycwoJCW1ldGEuZGYgPC0gY21wLm9iamVjdEBtZXRhLmRhdGEKCQlmb3Iocm93LmlkIGluIHJvd25hbWVzKGVucmljaC5kZikpewoJCQl0b3QuY2x1cyA8LSBucm93KG1ldGEuZGZbbWV0YS5kZltbbWV0YS5jb2xdXSA9PSByb3cuaWQsXSkKCQkJZm9yKGNvbC5pZCBpbiBjb2xuYW1lcyhlbnJpY2guZGYpKXsKCQkJCW51bS54IDwtIG5yb3cobWV0YS5kZlsobWV0YS5kZltbbWV0YS5jb2xdXSA9PSByb3cuaWQpICYgKG1ldGEuZGYkY2x1c3QuSUQgPT0gY29sLmlkKSxdKQoJCQkJcGN0LnggPC0gYXMuaW50ZWdlcihudW0ueCAvIHRvdC5jbHVzICoxMDApCgkJCQkjIHByaW50KHBjdC54KQoJCQkJZW5yaWNoLmRmW3Jvdy5pZCwgY29sLmlkXSA8LSBwY3QueAoJCQl9CgkJfQoJCWNvbG5hbWVzKGVucmljaC5kZikgPC0gc2FwcGx5KGNvbG5hbWVzKGVucmljaC5kZiksIGZ1bmN0aW9uKHgpIHBhc3RlMCgib2xkY2x1c3RlciIsIHgpKQoJCXJvd25hbWVzKGVucmljaC5kZikgPC0gc2FwcGx5KHJvd25hbWVzKGVucmljaC5kZiksIGZ1bmN0aW9uKHgpIHBhc3RlMCgibmV3Y2x1c3RlciIsIHgpKQoJCXhsc3g6OndyaXRlLnhsc3goZW5yaWNoLmRmLCBmaWxlID0gcGFzdGUwKCJQY3RPZk5ld0NsdXN0ZXJzT3ZlcmxhcHBpbmdPbGRDbHVzdGVyc18iLCBwcm9qZWN0TmFtZSwgIl9kaW0iLCBuZGltcywgIi54bHN4IiksIHNoZWV0TmFtZSA9IHBhc3RlMChnc3ViKCJSTkFfc25uXyIsICIiLCBtZXRhLmNvbCkpLCBhcHBlbmQgPSBUUlVFKQoJCXByaW50KGVucmljaC5kZikKCX0KfQoKYGBgCkFic29sdXRlbHkgdGVycmlibGUgb3ZlcmxhcCwgbm8gZW5yaWNobWVudCBvZiBhbnkgb2YgdGhlc2UgYWNyb3NzIHRoZSBuZXcgY2x1c3RlcmluZyBhbGdvcml0aG0uIE1heWJlIHNob3VsZCB0cnkgOTUlIHZhcmlhdGlvbiBjb3ZlcmVkCgojIyBGaW5kIG9sZCBjZWxscyBvbiBVTUFQCgp0aW1lIGZvciB0aGUgc3VwZXIgc2NhcmV5IG1vbWVudCB0byBzZWUgaWYgdGhlIGNlbGxzIGZyb20gc2V1cmF0djEgc3RpbGwgY2x1c3RlciB0b2dldGhlciBvbiBpbiBzZXVyYXQgdjQKCmBgYHtyIGZpZy53aWR0aCA9IDR9CkRpbVBsb3QoY21wLm9iamVjdCwKCQkJCXJlZHVjdGlvbiA9ICJ1bWFwIiwKCQkJCWdyb3VwLmJ5ID0gImNsdXN0LklEIiwgCgkJCQkjIHNwbGl0LmJ5ID0gIm9yaWcuaWRlbnQiLAoJCQkJY29scyA9IGMoImdyYXkiLCAib3JhbmdlIiwgImJsdWUiLCAicmVkIiwgImdyZWVuIiksKQpgYGAKYGBge3IgZmlnLndpZHRoID0gNH0KRGltUGxvdChjbXAub2JqZWN0LAoJCQkJcmVkdWN0aW9uID0gInVtYXAiLAoJCQkJZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIsIAoJCQkJc3BsaXQuYnkgPSAiY2x1c3QuSUQiLAoJCQkJY29scyA9IGMoImdyYXkiLCAib3JhbmdlIiwgImJsdWUiLCAicmVkIiwgImdyZWVuIiksKQpgYGAKCgoKIyBUb3RhbCB2YXIgOTUlCgojIyBOZWlnaGJvcmhvb2QgYW5kIHVtYXAKc2V0IHRvdGFsLnZhciA8LSA5NSUKYGBge3J9CnRvdC52YXIgPC0gcGVyY2VudC52YXJpYW5jZShjbXAub2JqZWN0QHJlZHVjdGlvbnMkcGNhQHN0ZGV2LCBwbG90LnZhciA9IEZBTFNFLCByZXR1cm4udmFsID0gVFJVRSkKbmRpbXMgPC0gbGVuZ3RoKHdoaWNoKGN1bXN1bSh0b3QudmFyKSA8PSA5NSkpCgpjbXAub2JqZWN0IDwtIEZpbmROZWlnaGJvcnMoY21wLm9iamVjdCwgZGltcyA9IDE6bmRpbXMpCmNtcC5vYmplY3QgPC0gRmluZENsdXN0ZXJzKGNtcC5vYmplY3QsIHJlc29sdXRpb24gPSAwLjUpCmNtcC5vYmplY3QgPC0gUnVuVU1BUChjbXAub2JqZWN0LCBkaW1zID0gMTogbmRpbXMpCgpgYGAKUGxvdCBVTUFQCgpgYGB7cn0KZm9yKHggaW4gYygwLjUsIDEsIDEuNSwgMiwgMi41KSl7CgljbXAub2JqZWN0IDwtIEZpbmRDbHVzdGVycyhjbXAub2JqZWN0LCByZXNvbHV0aW9uID0geCkKfQpzYXZlUkRTKGNtcC5vYmplY3QsIGZpbGUgPSBwYXN0ZTAocHJvamVjdE5hbWUsICJfZGltIiwgbmRpbXMsICIuUkRTIikpCmBgYAoKYGBge3J9CmNtcC5vYmplY3QgPC0gcmVhZFJEUygiQ01QX2RpbTQxLlJEUyIpCmBgYAoKCmBgYHtyIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNX0KcGxvdC50aXRsZSA8LSBwYXN0ZTAocHJvamVjdE5hbWUsICJfY2x1c3RyZWVfbmRpbSIsIG1heChjbXAub2JqZWN0QGNvbW1hbmRzJFJ1blVNQVAuUk5BLnBjYSRkaW1zKSkKbXkuY2x1c3RyZWUgPC0gY2x1c3RyZWUoY21wLm9iamVjdCwgcHJlZml4ID0gIlJOQV9zbm5fcmVzLiIsIG5vZGVfY29sb3VyID0gInNjM19zdGFiaWxpdHkiLCBleHBycyA9ICJzY2FsZS5kYXRhIikgKyAKCXNjYWxlX2NvbG9yX2NvbnRpbnVvdXMobG93ID0gJ3JlZDMnLCBoaWdoID0gJ3doaXRlJykgKyAKCWdndGl0bGUocGxvdC50aXRsZSkKcG5nKGZpbGVuYW1lID0gcGFzdGUwKHBsb3QudGl0bGUsICIucG5nIiksIGhlaWdodCA9IDgwMCwgd2lkdGggPSAxNjAwKQpwbG90KG15LmNsdXN0cmVlKQpkZXYub2ZmKCkKYGBgCgpGb3IgZWFjaCByZXNvbHV0aW9uLCB3aGF0IHBlcmNlbnRhZ2Ugb2YgY2VsbHMgaW4gZWFjaCBjbHVzdGVyIGFyZSBlbnJpY2hlZCBmb3Igb25lIG9mIG91ciBjbHVzdC5JRHM/CgoKVGVzdDogd2hhdCBwZXJjZW50YWdlIG9mIGVhY2ggbmV3IGNsdXN0ZXJJRCBtYXRjaGVzIG9uZSBvZiB0aGUgb2xkZXIgY2x1c3RlcnM/CmBgYHtyfQpmb3IgKG1ldGEuY29sIGluIGNvbG5hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSl7CglpZihncmVwbChwYXR0ZXJuID0gKCJSTkFfc25uX3JlcyIpLCB4ID0gbWV0YS5jb2wpPT1UUlVFKXsKCQluZXcuY2x1c3RlcnMgPC0gc29ydChhcy5udW1lcmljKGxldmVscyhjbXAub2JqZWN0QG1ldGEuZGF0YVtbbWV0YS5jb2xdXSkpKQoJCWVucmljaC5kZiA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gNCwgbnJvdyA9IGxlbmd0aChuZXcuY2x1c3RlcnMpKSkKCQljb2xuYW1lcyhlbnJpY2guZGYpIDwtIGMoMywgMTcsIDEwLCAxMSkKCQlyb3duYW1lcyhlbnJpY2guZGYpIDwtIG5ldy5jbHVzdGVycwoJCW1ldGEuZGYgPC0gY21wLm9iamVjdEBtZXRhLmRhdGEKCQlmb3Iocm93LmlkIGluIHJvd25hbWVzKGVucmljaC5kZikpewoJCQl0b3QuY2x1cyA8LSBucm93KG1ldGEuZGZbbWV0YS5kZltbbWV0YS5jb2xdXSA9PSByb3cuaWQsXSkKCQkJZm9yKGNvbC5pZCBpbiBjb2xuYW1lcyhlbnJpY2guZGYpKXsKCQkJCW51bS54IDwtIG5yb3cobWV0YS5kZlsobWV0YS5kZltbbWV0YS5jb2xdXSA9PSByb3cuaWQpICYgKG1ldGEuZGYkY2x1c3QuSUQgPT0gY29sLmlkKSxdKQoJCQkJcGN0LnggPC0gYXMuaW50ZWdlcihudW0ueCAvIHRvdC5jbHVzICoxMDApCgkJCQkjIHByaW50KHBjdC54KQoJCQkJZW5yaWNoLmRmW3Jvdy5pZCwgY29sLmlkXSA8LSBwY3QueAoJCQl9CgkJfQoJCWNvbG5hbWVzKGVucmljaC5kZikgPC0gc2FwcGx5KGNvbG5hbWVzKGVucmljaC5kZiksIGZ1bmN0aW9uKHgpIHBhc3RlMCgib2xkY2x1c3RlciIsIHgpKQoJCXJvd25hbWVzKGVucmljaC5kZikgPC0gc2FwcGx5KHJvd25hbWVzKGVucmljaC5kZiksIGZ1bmN0aW9uKHgpIHBhc3RlMCgibmV3Y2x1c3RlciIsIHgpKQoJCXhsc3g6OndyaXRlLnhsc3goZW5yaWNoLmRmLCBmaWxlID0gcGFzdGUwKCJQY3RPZk5ld0NsdXN0ZXJzT3ZlcmxhcHBpbmdPbGRDbHVzdGVyc18iLCBwcm9qZWN0TmFtZSwgIl9kaW0iLCBuZGltcywgIi54bHN4IiksIHNoZWV0TmFtZSA9IHBhc3RlMChnc3ViKCJSTkFfc25uXyIsICIiLCBtZXRhLmNvbCkpLCBhcHBlbmQgPSBUUlVFKQoJCXByaW50KGVucmljaC5kZikKCX0KfQoKYGBgCkFic29sdXRlbHkgdGVycmlibGUgb3ZlcmxhcCwgbm8gZW5yaWNobWVudCBvZiBhbnkgb2YgdGhlc2UgYWNyb3NzIHRoZSBuZXcgY2x1c3RlcmluZyBhbGdvcml0aG0uIE1heWJlIHNob3VsZCB0cnkgOTUlIHZhcmlhdGlvbiBjb3ZlcmVkCgojIyBGaW5kIG9sZCBjZWxscyBvbiBVTUFQCgp0aW1lIGZvciB0aGUgc3VwZXIgc2NhcmV5IG1vbWVudCB0byBzZWUgaWYgdGhlIGNlbGxzIGZyb20gc2V1cmF0djEgc3RpbGwgY2x1c3RlciB0b2dldGhlciBvbiBpbiBzZXVyYXQgdjQKCmBgYHtyIGZpZy53aWR0aCA9IDJ9CkRpbVBsb3QoY21wLm9iamVjdCwKCQkJCXJlZHVjdGlvbiA9ICJ1bWFwIiwKCQkJCWdyb3VwLmJ5ID0gImNsdXN0LklEIiwgCgkJCQlwdC5zaXplID0gLjEsCgkJCQkjIHNwbGl0LmJ5ID0gIm9yaWcuaWRlbnQiLAoJCQkJY29scyA9IGMoImdyYXkiLCAib3JhbmdlIiwgImJsdWUiLCAicmVkIiwgImdyZWVuIiksKQpgYGAKYGBge3IgZmlnLndpZHRoID0gNH0KRGltUGxvdChjbXAub2JqZWN0LAoJCQkJcmVkdWN0aW9uID0gInVtYXAiLAoJCQkJZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIsIAoJCQkJc3BsaXQuYnkgPSAiY2x1c3QuSUQiLAoJCQkJY29scyA9IGMoImdyYXkiLCAib3JhbmdlIiwgImJsdWUiLCAicmVkIiwgImdyZWVuIiksKQpgYGAKCgoKIyMjIEdlbmUgZXhwcmVzc2lvbiBvZiBvbGQgY2x1c3RycyBvbiBuZXcgbWFwCkxldCdzIHNlZSBpZiB3ZSBjYW4gZ2V0IHNvbWUgZ2VuZSBleHByZXNzaW9uIHByb2ZpbGVzIG9uIHRoZXNlLi4uCmBgYHtyLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTh9CmdlbmUubGlzdCA8LSBjKCJHYXRhMSIsICJHYXRhMiIsICJQZjQiLCAiRG50dCIsICJNcG8iLCAiTWVpczEiLCAiSXJmOCIsICJFbGFuZSIsICJGbGkxIiwgIlpmcG0xIikKVmxuUGxvdChjbXAub2JqZWN0LCBmZWF0dXJlcyA9IGdlbmUubGlzdCwgZ3JvdXAuYnkgPSAiY2x1c3QuSUQiLCBwdC5zaXplID0gMC4wMSwgY29scyA9IGMoImdyYXkiLCAib3JhbmdlIiwgImJsdWUiLCAicmVkIiwgImdyZWVuIikpCmBgYAoKClVzZWQgdGhlIGV4Y2UgZG9jIHRvIGRvIHNvbWUgZmFuY3kgY29uZGl0aW9uYWwgZm9ybWF0dGluZy4gT2xkIGNsdXN0ZXIgMTcgaXMgcHJldHR5IGRpc3BlcnNlZCB1bnRpbCB5b3UgaXQgcmVzb2x1dGlvbiAyLjUuIE90aGVyaXNlLCBjZWxscyBpbiBvbGQgY2x1c3RlciAxNyBkbyBub3QgY29uc3RpdHV0ZSBtb3JlIHRoYW4gNDAlIG9mIGFueSBjZWxscyBpbiB0aGUgbmV3IGNsdXN0ZXJzLiAgCkFzIGZhciBhcyBJIGNhbiBzZWUsIHRoZSB0d28gYXBwcm9hY2hlcyBhcmUgdG8gZG8gREdFb2YgbmV3IENNUCB3LyByZXNvbHV0aW9uID0gMi41LCBBTkQvT1IgZG8gREdlIHVzaW5nIG9sZGVyIGNsdXN0ZXIgSURzLiBTdXJlIHNlZW1zIHRvIG1ha2Ugc2Vuc2UgdG8gZG8gYm90aC4uLgoKCiMgREdFIHcvIHJlc29sdXRpb24gPSAyLjUKU3RydCB3aXRoIGNvbXBhcmluZyBhbGwgY2x1c3RlcnMgYWdhaW5zdCBhbGwgb3RoZXIgY2x1c3RlcnMKV3JpdGUgb3V0IGNsdXN0ZXIgaW5mbwoKCmNhbGN1bGF0ZSBgRmluZEFsbE1hcmtlcnMoKWAgZm9yIGRpZmZlcmVudCBpZGVudHMgYW5kIHNhdmUgdG8gbmV3IGZpbGUKYGBge3J9CmlkZW50Lmxpc3QgPC0gYygiUk5BX3Nubl9yZXMuMC41IiwgIlJOQV9zbm5fcmVzLjEiLCAiUk5BX3Nubl9yZXMuMS41IiwgIlJOQV9zbm5fcmVzLjIiLCAiUk5BX3Nubl9yZXMuMi41IiwgImNsdXN0LklEIikKZm9yKHRlc3RlZC5pZGVudCBpbiBpZGVudC5saXN0KXsKCUlkZW50cyhjbXAub2JqZWN0KSA8LSB0ZXN0ZWQuaWRlbnQKCWFsbC5tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKGNtcC5vYmplY3QpCgl4bHN4Ojp3cml0ZS54bHN4KHggPSBhbGwubWFya2Vyc1ssYygiYXZnX2xvZzJGQyIsICJwX3ZhbF9hZGoiLCAiY2x1c3RlciIsICJnZW5lIildLCAKCQkJCQkJCQkJIGZpbGUgPSBwYXN0ZTAocHJvamVjdE5hbWUsICJfRmluZEFMTE1hcmtlcnNfcmVzMi41Lnhsc3giKSwgCgkJCQkJCQkJCSBzaGVldE5hbWUgPSB0ZXN0ZWQuaWRlbnQsIAoJCQkJCQkJCQkgY29sLm5hbWVzID0gVFJVRSwgCgkJCQkJCQkJCSByb3cubmFtZXMgPSBGQUxTRSwgCgkJCQkJCQkJCSBhcHBlbmQgPSBUUlVFKQp9CmBgYAoKQ3JlYXRlIGBGaW5kQWxsTWFya2VycygpYCBsaXN0cyBmb3IgR1NFQQpgYGB7ciB9CklkZW50cyhjbXAub2JqZWN0KSA8LSAiUk5BX3Nubl9yZXMuMi41IgpyZXMuMi41LmFsbG1hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoY21wLm9iamVjdCkKYGBgCgojIyBNYXAgSEdOQyBzeW1ib2xzCmBgYHtyfQpNb3VzZTJIdW1hblRhYmxlIDwtIE1vdXNlMkh1bWFuKHJlcy4yLjUuYWxsbWFya2VycyRnZW5lKQoKSEdOQyA8LSB3aXRoKE1vdXNlMkh1bWFuVGFibGUsIE1vdXNlMkh1bWFuVGFibGUkSEdOQ1ttYXRjaChyZXMuMi41LmFsbG1hcmtlcnMkZ2VuZSwgTW91c2UySHVtYW5UYWJsZSRNR0kpXSkKaGVhZChyZXMuMi41LmFsbG1hcmtlcnMpCnJlcy4yLjUuYWxsbWFya2VycyRIR05DIDwtIEhHTkMKdGFpbChyZXMuMi41LmFsbG1hcmtlcnMpCnNpZy5yZXMuMi41IDwtIHJlcy4yLjUuYWxsbWFya2Vyc1tyZXMuMi41LmFsbG1hcmtlcnMkcF92YWxfYWRqIDw9IDAuMDUsIF0Kc2lnLnJlcy4yLjUgPC0gc2lnLnJlcy4yLjVbYygiYXZnX2xvZzJGQyIsICJIR05DIiwgImNsdXN0ZXIiKV0Kc2lnLnJlcy4yLjUgPC0gc2lnLnJlcy4yLjVbIShzaWcucmVzLjIuNSRIR05DID09ICIiIHwgaXMubmEoc2lnLnJlcy4yLjUkSEdOQykpLF0gIyBHU0VBIHdpbGwgZmFpbCBpZiB0aGVyZSBhcmUgYW55IGJsYW5rcyBvciBOQXMgaW4gdGhlIHRhYmxlCnNpZy5yZXMuMi41IDwtIHNpZy5yZXMuMi41W10KCmBgYAoKCmBgYHtyfQpmb3IoY2x1c3RlciBpbiB1bmlxdWUoc2lnLnJlcy4yLjUkY2x1c3RlcikpewoJcHJpbnQocGFzdGUoIndyaXRpbmcgY2x1c3RlciIsIGNsdXN0ZXIpKQoJbmV3LnRhYmxlIDwtIHNpZy5yZXMuMi41W3NpZy5yZXMuMi41JGNsdXN0ZXIgPT0gY2x1c3RlciwgYygiSEdOQyIsICJhdmdfbG9nMkZDIildCgluZXcudGFibGUgPC0gbmV3LnRhYmxlW29yZGVyKC1uZXcudGFibGUkYXZnX2xvZzJGQyksIF0KCXdyaXRlLnRhYmxlKG5ldy50YWJsZSwgZmlsZSA9IHBhc3RlMCgiUmFua0xpc3RfcmVzMi41X2ZpbmRBbGxfaGduYy9yZXMuMi41Y2x1c3RlciIsIGNsdXN0ZXIsICIucm5rIiksIHF1b3RlID0gRkFMU0UsIHJvdy5uYW1lcyA9IEZBTFNFLCBjb2wubmFtZXMgPSBUUlVFLCBzZXAgPSAiXHQiLCApCgkKfQpgYGAKCgoKY2FsY3VsYXRlIGBGaW5kTWFya2VycygpYCB0aGF0IGRpc3Rpbmd1aXNoIGVhY2ggY2x1c3RlciAobWlnaHQgb3ZlcmxhYiBiZXR3ZWVuIGNsdXN0ZXJzKQpgYGB7cn0KaWRlbnQubGlzdCA8LSBjKCJSTkFfc25uX3Jlcy4wLjUiLCAiUk5BX3Nubl9yZXMuMSIsICJSTkFfc25uX3Jlcy4xLjUiLCAiUk5BX3Nubl9yZXMuMiIsICJSTkFfc25uX3Jlcy4yLjUiLCAiY2x1c3QuSUQiKQpmb3IodGVzdGVkLmlkZW50IGluIGlkZW50Lmxpc3QpewoJb2JqZWN0LmNvcHkgPC0gY21wLm9iamVjdAoJSWRlbnRzKG9iamVjdC5jb3B5KSA8LSB0ZXN0ZWQuaWRlbnQKCXByaW50KHBhc3RlKCJ0ZXN0aW5nIiwgdGVzdGVkLmlkZW50KSkKCWZvciAoY2x1c3RlciBpbiBzb3J0KGFzLm51bWVyaWMobGV2ZWxzKG9iamVjdC5jb3B5QG1ldGEuZGF0YVtbdGVzdGVkLmlkZW50XV0pKSkpewoJCXByaW50KHBhc3RlKCJsb29raW5nIGF0IGNsdXN0ZXIiLCBjbHVzdGVyKSkKCQljbHVzdGVyLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0LmNvcHksIGlkZW50LjEgPSBjbHVzdGVyKQoJCXRyeSgKCQkJeGxzeDo6d3JpdGUueGxzeCh4ID0gY2x1c3Rlci5tYXJrZXJzWyxjKCJhdmdfbG9nMkZDIiwgInBfdmFsX2FkaiIpXSwgCgkJCQkJCQkJCQkJIGZpbGUgPSBwYXN0ZTAocHJvamVjdE5hbWUsICJfRmluZE1hcmtlcnNfIiwgZ3N1YigiUk5BX3Nubl8iLCAiIiwgdGVzdGVkLmlkZW50KSwgIi54bHN4IiksIAoJCQkJCQkJCQkJCSBzaGVldE5hbWUgPSBwYXN0ZTAoImNsc3QiLCBjbHVzdGVyKSwgCgkJCQkJCQkJCQkJIGNvbC5uYW1lcyA9IFRSVUUsIAoJCQkJCQkJCQkJCSByb3cubmFtZXMgPSBUUlVFLCAKCQkJCQkJCQkJCQkgYXBwZW5kID0gVFJVRSkKCQkpCQoJfQoJcmVtb3ZlKG9iamVjdC5jb3B5KQp9CmBgYAoKCgpgYGB7cn0KZm9yIChjbHVzdGVyIGluIHNvcnQoYXMubnVtZXJpYyhsZXZlbHMoY21wLm9iamVjdEBtZXRhLmRhdGEkUk5BX3Nubl9yZXMuMi41KSkpKXsKCWNsdXN0ZXIubWFya2VycyA8LSBGaW5kTWFya2VycyhjbXAub2JqZWN0LCBpZGVudC4xID0gY2x1c3RlcikKCXhsc3g6OndyaXRlLnhsc3goeCA9IGNsdXN0ZXIubWFya2Vyc1ssYygiYXZnX2xvZzJGQyIsICJwX3ZhbF9hZGoiKV0sIAoJCQkJCQkJCQkgZmlsZSA9IHBhc3RlMChwcm9qZWN0TmFtZSwgIl9GaW5kTWFya2Vyc19yZXMyLjUueGxzeCIpLCAKCQkJCQkJCQkJIHNoZWV0TmFtZSA9IHBhc3RlMCgiY2xzdCIsIGNsdXN0ZXIpLCAKCQkJCQkJCQkJIGNvbC5uYW1lcyA9IFRSVUUsIAoJCQkJCQkJCQkgcm93Lm5hbWVzID0gVFJVRSwgCgkJCQkJCQkJCSBhcHBlbmQgPSBUUlVFKQp9CmBgYAoKIyMgQ29tYmluZSBjbHVzdGVycyB0aGF0IG1pZ2h0IHJlcHJlc2VudCBvbGQgY2x1c3RlciBpZHMKCiMgREdFIHcvIG1ldGFkYXRhIGFnYWluc3QgY2x1c3QuSUQgYWdhaW5zdCAiMCIKcmVzZXQgaWRlbnQgYXMgImNsdXN0LklEIiBhbmQgcmVydW4gYEZpbmRBbGxNYXJrZXJzKClgCmBgYHtyfQoJSWRlbnRzKGNtcC5vYmplY3QpIDwtICJjbHVzdC5JRCIKCWFsbC5tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKGNtcC5vYmplY3QpCgl4bHN4Ojp3cml0ZS54bHN4KHggPSBhbGwubWFya2Vyc1ssYygiYXZnX2xvZzJGQyIsICJwX3ZhbF9hZGoiLCAiY2x1c3RlciIsICJnZW5lIildLCAKCQkJCQkJCQkJIGZpbGUgPSBwYXN0ZTAocHJvamVjdE5hbWUsICJfRmluZEFMTE1hcmtlcnNfY2x1c3RJRC54bHN4IiksIAoJCQkJCQkJCQkgc2hlZXROYW1lID0gImNsdXN0SUQiLCAKCQkJCQkJCQkJIGNvbC5uYW1lcyA9IFRSVUUsIAoJCQkJCQkJCQkgcm93Lm5hbWVzID0gRkFMU0UsIAoJCQkJCQkJCQkgYXBwZW5kID0gVFJVRSkKYGBgCgoKYGBge3J9CiMgSWRlbnRzKGNtcC5vYmplY3QpIDwtICJjbHVzdC5JRCIKZm9yIChjbHVzdGVyIGluIHVuaXF1ZShjbXAub2JqZWN0QG1ldGEuZGF0YSRjbHVzdC5JRCkpewoJcHJpbnQoY2x1c3RlcikKCWNsdXN0ZXIubWFya2VycyA8LSBGaW5kTWFya2VycyhjbXAub2JqZWN0LCBpZGVudC4xID0gY2x1c3RlcikKCXhsc3g6OndyaXRlLnhsc3goeCA9IGNsdXN0ZXIubWFya2Vyc1ssYygiYXZnX2xvZzJGQyIsICJwX3ZhbF9hZGoiKV0sIAoJCQkJCQkJCQkgZmlsZSA9IHBhc3RlMChwcm9qZWN0TmFtZSwgIl9GaW5kTWFya2Vyc19jbHVzdElELnhsc3giKSwgCgkJCQkJCQkJCSBzaGVldE5hbWUgPSBwYXN0ZTAoIm9sZGNsdXN0IiwgY2x1c3RlciksIAoJCQkJCQkJCQkgY29sLm5hbWVzID0gVFJVRSwgCgkJCQkJCQkJCSByb3cubmFtZXMgPSBUUlVFLCAKCQkJCQkJCQkJIGFwcGVuZCA9IFRSVUUpCn0KCmBgYAoKCiMgRGlzdGluZ3Vpc2hpbmcgZmVhdHVyZXMgb2YgY2x1c3RlcnMKUHJldmlvdXNseSBkZWZpbmVkIGJpb21hcmsgZ2VuZXMgYmFzZWQgb24gUEMgY29udHJpYnV0aW9ucy4gT3JpZ2luYWwgbGlzdCB3YXMgYmFzZWQgb24gKmFsbCogbXNBZ2dyLCBidXQgbGV0J3Mgc2VlIGhvdyBDTVAgc3Vic2V0IGRvZXM/CmBgYHtyIGZpZy5oZWlnaHQgPSAzMCwgZmlnLndpZHRoPTZ9ClZpekRpbUxvYWRpbmdzKGNtcC5vYmplY3QsIGRpbXMgPSAxOjEwLCBuZmVhdHVyZXMgPSAzMCwgcmVkdWN0aW9uID0gInBjYSIsIG5jb2wgPSAyKQpgYGAKCmBgYHtyfQpwY2EuZGYgPC0gY21wLm9iamVjdFtbInBjYSJdXQpwY2EuZGYgPC0gYXMuZGF0YS5mcmFtZShhcy5tYXRyaXgoc2xvdChvYmplY3QgPSBwY2EuZGYsIG5hbWUgPSAiZmVhdHVyZS5sb2FkaW5ncyIpKSkKcHJpbnQoY21wLm9iamVjdFtbInBjYSJdXSwgZGltcyA9IDIsIG5mZWF0dXJlcyA9IDUpCnJvd25hbWVzKHBjYS5kZltwY2EuZGYkUENfMiAlaW4lIHNvcnQocGNhLmRmJFBDXzIsIGRlY3JlYXNpbmcgPSBUUlVFKVsxOjVdLCBdKQpyb3duYW1lcyhwY2EuZGZbcGNhLmRmJFBDXzIgJWluJSBzb3J0KHBjYS5kZiRQQ18yKVsxOjVdLCBdKQpgYGAKCm5vdyB3ZSBjYW4gZ2V0IGEgbGlzdCBvZiBwcmluY2lwYWwgY29tcG9uZW50cyEgIApmaXJzdCBwdWxsIHRoZSBsaXN0IG9mIG9sZEFuYWx5c2lzIENNUCB0b3AgUEMgZ2VuZXMKYGBge3J9CmNtcC5iaW9tYXJrIDwtIHJlYWQudGFibGUoZmlsZSA9ICIvVXNlcnMvaGV1c3RvbmVmL0Rlc2t0b3AvQ01QU3VicG9wcy9CaW9NYXJrL1Byb2JlUGFuZWxzL0NNUF9QQ1RvcEdlbmVzLnR4dCIsIHNlcCA9ICJcdCIsIGhlYWRlciA9IFRSVUUpCmJpb21hcmsuY21wdGFyZ2V0cyA8LSBjKCkKZm9yKGRmLmNvbCBpbiAxOm5jb2woY21wLmJpb21hcmspKXsKCWJpb21hcmsuY21wdGFyZ2V0cyA8LSBjKGJpb21hcmsuY21wdGFyZ2V0cywgYmlvbWFya1ssZGYuY29sXSkKfQpwcmludChjb2xuYW1lcyhiaW9tYXJrKSkKcHJpbnQocGFzdGUoInRvdGFsIGdlbmUgY291bnQ6IiwgbGVuZ3RoKGJpb21hcmsuY21wdGFyZ2V0cykpKQpgYGAKCk5vdyBnZXQgdGhlIGxpc3Qgb2YgY3VycmVudCBwYyBnZW5lIHRyZ2V0cyAob2xkQW5hbHlzaXMgdXNlZCBuZGltID0gMTo2LCBzbyB3ZSdsbCBzdGFydCB3aXRoIHRoYXQgcmFuZ2UpCmBgYHtyfQpwYy5saXN0IDwtIGMoIlBDXzEiLCAiUENfMiIsICJQQ18zIiwgIlBDXzQiLCAiUENfNSIsICJQQ182IikKcGMuZ2VuZXMgPC0gbGFwcGx5KHBjLmxpc3QsIGZ1bmN0aW9uKHgpIHJvd25hbWVzKHBjYS5kZltwY2EuZGZbW3hdXSAlaW4lIHNvcnQocGNhLmRmW1t4XV0sIGRlY3JlYXNpbmcgPSBUUlVFKVsxOjMwXSxdKSkgI3RhcmdldGluZyByb3VnaGx5IDE4MCBnZW5lcyBsaWtlIGluIGJpb21hcmsuY21wdGFyZ2V0cwpwYy5nZW5lcyA8LSB1bmlxdWUodW5saXN0KHBjLmdlbmVzKSkKcHJpbnQocGFzdGUoInRvdGFsIGdlbmUgY291bnQ6IiwgbGVuZ3RoKHBjLmdlbmVzKSkpCmBgYAoKTm93IGNvbXBhcmUgdGhlIGxpc3RzLCBJIGd1ZXNzOgoKYGBge3J9CiMgc2V0ZGlmZih4LHkpIGdpdmVzIHlvdSB0aGluZ3MgaW4geCBub3QgaW4geS4gc2V0ZGlmZih5LHgpIGdpdmVzIHlvdSB0aGluZ3MgaW4geSBub3QgaW4geApzZXRkaWZmKGJpb21hcmsuY21wdGFyZ2V0cywgcGMuZ2VuZXMpCiMgcHJpbnQocGFzdGUoIlxuIGxlbmd0aDoiLCBsZW5ndGgoc2V0ZGlmZihiaW9tYXJrLmNtcHRhcmdldHMsIHBjLmdlbmVzKSkpKQp3cml0ZUxpbmVzKGMoIiIsICJsZW5ndGg6IiwgbGVuZ3RoKHNldGRpZmYoYmlvbWFyay5jbXB0YXJnZXRzLCBwYy5nZW5lcykpKSkKYGBgClVtbSwgeWVhaCB0aGF0IHdlbnQga2luZGEgaG93IEkgZXhwZWN0ZWQuIExldCdzIGRvIHRoaXMgYWdhaW4sIGJ1dCBmb3IgdGhlIGFjdHVhbCBiaW9tYXJrIGdlbmUgbGlzdHMuCmBgYHtyfQpiaW9tYXJrIDwtIHJlYWQudGFibGUoZmlsZSA9ICIvVXNlcnMvaGV1c3RvbmVmL0Rlc2t0b3AvQ01QU3VicG9wcy9CaW9NYXJrL1Byb2JlUGFuZWxzL0Jpb21hcmtQcm9iZUxpc3QudHh0Iiwgc2VwID0gIlx0IikKYmlvbWFyayA8LSBiaW9tYXJrWywxXQpzZXRkaWZmKGJpb21hcmssIHBjLmdlbmVzKQp3cml0ZUxpbmVzKGMoIiIsICJsZW5ndGg6IiwgbGVuZ3RoKHNldGRpZmYoYmlvbWFyaywgcGMuZ2VuZXMpKSkpCmBgYAoKCldoYXQgaWYgd2UgaW5jcmVhc2UgdGhlIG51bWJlciBvZiBwY3MgYnV0IGRlY3JlYXNlIHRoZSBkZXB0aCBvZiBlYWNoPyBUaGlzIG1pZ2h0IGNvdmVyIG1vcmUgb2YgYGJpb21hcmsJYCwgd2hpY2ggd2FzIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIHVzaW5nIG1zQWdnciBpbnN0ZWFkIG9mIG9ubHkgdGhlIENNUCBzdWJzZXQKYGBge3J9CnBjLmxpc3QgPC0gYygiUENfMSIsICJQQ18yIiwgIlBDXzMiLCAiUENfNCIsICJQQ181IiwgIlBDXzYiLCAiUENfNyIsICJQQ184IiwgIlBDXzkiLCAiUENfMTAiKQpwYy5nZW5lcyA8LSBsYXBwbHkocGMubGlzdCwgZnVuY3Rpb24oeCkgcm93bmFtZXMocGNhLmRmW3BjYS5kZltbeF1dICVpbiUgc29ydChwY2EuZGZbW3hdXSwgZGVjcmVhc2luZyA9IFRSVUUpWzE6MjBdLF0pKQpwYy5nZW5lcyA8LSB1bmlxdWUodW5saXN0KHBjLmdlbmVzKSkKcHJpbnQocGFzdGUoInRvdGFsIGdlbmUgY291bnQ6IiwgbGVuZ3RoKHBjLmdlbmVzKSkpCgpgYGAKYGBge3J9CnNldGRpZmYoYmlvbWFyaywgcGMuZ2VuZXMpCndyaXRlTGluZXMoYygiIiwgImxlbmd0aDoiLCBsZW5ndGgoc2V0ZGlmZihiaW9tYXJrLCBwYy5nZW5lcykpKSkKYGBgCgpGb3IgY29tcGFyaXNvbiwgbGV0J3MganVzdCBzZWUgaG93IG1hbnkgb2YgYGJpb21hcmsuY21wdGFyZ2V0c2Agd2VyZSBhY3R1YWxseSBpbmNsdWRlZCBpbiBgYmlvbWFya2AKYGBge3J9CnNldGRpZmYoYmlvbWFyay5jbXB0YXJnZXRzLCBiaW9tYXJrKQp3cml0ZUxpbmVzKGMoIiIsICJsZW5ndGg6IiwgbGVuZ3RoKHNldGRpZmYoYmlvbWFyay5jbXB0YXJnZXRzLCBwYy5nZW5lcykpKSkKYGBgCmBgYHtyfQpsZW5ndGgoYmlvbWFyaykgLSBsZW5ndGgoc2V0ZGlmZihiaW9tYXJrLCBiaW9tYXJrLmNtcHRhcmdldHMpKQpgYGAKYGBge3J9Cmxlbmd0aChiaW9tYXJrKSAtIGxlbmd0aChzZXRkaWZmKGJpb21hcmssIHBjLmdlbmVzKSkKYGBgClNvIHdoZW4geW91IGxvb2sgYXQgaXQgbGlrZSB0aGF0LCBpdCdzIG5vdCBhY3R1YWxseSB0aGF0IGZhciBvZmYuCgoKV2hhdCBhcmUgdGhlIHNpbWlsYXJpdGllcz86CmBgYHtyfQpzZXRkaWZmKHNldGRpZmYoYmlvbWFyaywgYmlvbWFyay5jbXB0YXJnZXRzKSwgc2V0ZGlmZihiaW9tYXJrLCBwYy5nZW5lcykpCmBgYApUaGVzZSBhcmUgZ2VuZXMgZnJvbSB0aGUgOTdwcm9iZXMgbm90IGluIHRoZSBvbGQgQ01QIHNldCB0aGF0IGFyZSBhbHNvIG5vdCBpbiB0aGUgbmV3IENNUCBzZXQuIE90aGVyIHRoYW4gSXRnYTJiICh3aGljaCBpcyBhIGZhaWxlZCBwcm9iZSBhbnl3YXkpLCBub3RoaW5nIHNjcmVhbXMuIEFsc28gd2UnZCBoYXZlIHRocm93biBGbHQzIGFuZCBDZDM0IGZvciBpbiBhbnl3YXkgYmVjYXVzZSB0aGV5J3JlIHJlcXVpc2l0ZSBjZWxsIHN1cmZhY2UgbWFya2VycyAoYWxzbyBGbHQzIHN1cmZhY2UgbWFya2VyIGlzIGV4cGVuc2l2ZSBidXQgb3RoZXJ3aXNlIG5vdCBub3Rld29ydGh5IGFuZCBub3QgdXNlZCBpbiB0aGUgY3VycmVudCBzb3J0aW5nIHN0cmF0ZWd5KQoKV2hhdCBhYm91dCBjZWxsIHN1cmZhY2UgbWFya2VyIGV4cHJlc3Npb24/CiogQ2QzNAoqIENkMTYvMzIKKiBDZDkKKiBDZDQxCiogQ2Q0OAoqIFNjYTEgKGp1c3QgdGhyb3cgdGhhdCBpbiBmb3Igc2gqJnMgYW5kIGdpZ2dsZXMpCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMTUsIGZpZy53aWR0aD0xMH0Kc3VyZmFjZS5tYXJrZXJzIDwtIGMoIkNkMzQiLCAiRmNncjMiLCAiRmNncjJiIiwgIkNkOSIsICJJdGdhMmIiLCAiQ2Q0OCIsICJMeTZhIikKRmVhdHVyZVBsb3QoY21wLm9iamVjdCwgZmVhdHVyZXMgPSBzdXJmYWNlLm1hcmtlcnMsIHB0LnNpemUgPSAxLCBzcGxpdC5ieSA9ICJjbHVzdC5JRCIsIG5jb2wgPSAxKQpgYGAKU2F2ZSBhcyBwbmcKYGBge3J9CnBuZyhmaWxlbmFtZSA9ICJGZWF0dXJlUGxvdF9DTVBfc3VyZmFjZU1hcmtlcnNfY2x1c3RJRGZhY2V0LnBuZyIsIGhlaWdodCA9IDE2MDAsIHdpZHRoID0gMTYwMCkKRmVhdHVyZVBsb3QoY21wLm9iamVjdCwgZmVhdHVyZXMgPSBzdXJmYWNlLm1hcmtlcnMsIHB0LnNpemUgPSAxLCBzcGxpdC5ieSA9ICJjbHVzdC5JRCIsIG5jb2wgPSAxKQpkZXYub2ZmKCkKYGBgCgoKCgoKCgojIENvbXBhcmUgQGcgaGllcmFyY2hjaWFsIGNsdXN0ZWlybmcKCkRvIGNsdXN0ZXJpbmcgdXNpbmcgYmlvbWFyayBSTkFzIGFzIGlucHV0CmBgYHtyfQojIFJlYWQgaW4gQmlvbWFya1JOQXMKYmlvbWFyay5ybmFzIDwtIHJlYWQudGFibGUoJy9Vc2Vycy9oZXVzdG9uZWYvRGVza3RvcC8xMFhHZW5vbWljc0RhdGEvQmlvbWFya1JOQXMudHh0JykKYmlvbWFyay5ybmFzIDwtIGJpb21hcmsucm5hcyRWMQpgYGAKCnVzZSBiaW9tYXJrIFJOQXMgdG8gZGVmaW5lIGRpbWVuc2lvbmFsIHJlZHVjdGlvbgpgYGB7cn0KY21wLm9iamVjdCA8LSByZWFkUkRTKCJDTVBfcmF3LlJEUyIpCmNtcC5vYmplY3QgPC0gUnVuUENBKGNtcC5vYmplY3QsIGZlYXR1cmVzID0gYmlvbWFyay5ybmFzLCBuZGltcy5wcmludCA9IDE6NSwgLCBuZmVhdHVyZXMucHJpbnQgPSA1KQpFbGJvd1Bsb3QoY21wLm9iamVjdCwgbmRpbXMgPSA1MCkKYGBgCgoKTm93IHJ1biB0aGUgY2x1c3RlcmluZwpgYGB7cn0KdG90LnZhciA8LSBwZXJjZW50LnZhcmlhbmNlKGNtcC5vYmplY3RAcmVkdWN0aW9ucyRwY2FAc3RkZXYsIHBsb3QudmFyID0gRkFMU0UsIHJldHVybi52YWwgPSBUUlVFKQpuZGltcyA8LSBsZW5ndGgod2hpY2goY3Vtc3VtKHRvdC52YXIpIDw9IDkwKSkKCmNtcC5vYmplY3QgPC0gRmluZE5laWdoYm9ycyhjbXAub2JqZWN0LCBkaW1zID0gMTpuZGltcykKY21wLm9iamVjdCA8LSBGaW5kQ2x1c3RlcnMoY21wLm9iamVjdCwgcmVzb2x1dGlvbiA9IDAuNSkKY21wLm9iamVjdCA8LSBSdW5VTUFQKGNtcC5vYmplY3QsIGRpbXMgPSAxOiBuZGltcykKCgpgYGAKCmZpbmQgdGhlIGNsdXN0ZXJzCgpgYGB7cn0KZm9yKHggaW4gYygwLjUsIDEsIDEuNSwgMiwgMi41KSl7CgljbXAub2JqZWN0IDwtIEZpbmRDbHVzdGVycyhjbXAub2JqZWN0LCByZXNvbHV0aW9uID0geCkKfQpgYGAKClBsb3QgdGhlIHVtYXBzIGFuZCBjZWxsIGNsdXN0ZXIgaWRzCmBgYHtyfQpmb3IgKG1ldGEuY29sIGluIGNvbG5hbWVzKGNtcC5vYmplY3RAbWV0YS5kYXRhKSl7CglpZihncmVwbChwYXR0ZXJuID0gKCJSTkFfc25uX3JlcyIpLCB4ID0gbWV0YS5jb2wpPT1UUlVFKXsKCQlteXBsb3QgPC0gRGltUGxvdChjbXAub2JqZWN0LCAKCQkJCQkJCQkJCQlncm91cC5ieSA9IG1ldGEuY29sLAoJCQkJCQkJCQkJCXJlZHVjdGlvbiA9ICJ1bWFwIiwgCgkJCQkJCQkJCQkJY29scyA9IGNvbG9yLnBhbGV0dGUKCQkJCQkJCQkJCQkpICsgCgkJCWdndGl0bGUocGFzdGUwKHByb2plY3ROYW1lLCAiIGRpbSIsIG5kaW1zLCAicmVzIiwgZ3N1YigiUk5BX3Nubl9yZXMiLCAiIiwgbWV0YS5jb2wpICkpCgkJcGxvdChteXBsb3QpCgl9Cn0KYGBgCiMjIyBDYWxjdWxhdGUgYW50aWNpcGF0ZWQgbnVtYmVyIG9mIGNlbGxzIHlvdSdsbCBmaW5kIGluIGVhY2ggYmlvbWFyayBjbHVzdGVyCkdldCAjIGNlbGxzIGluIGVhY2ggY2x1c3RlcgoKYGBge3J9CnRvdC5jZWxsY291bnQgPC0gbnJvdyhjbXAub2JqZWN0QG1ldGEuZGF0YSkKcmVzMDUubGlzdCA8LSBzb3J0KHVuaXF1ZShjbXAub2JqZWN0QG1ldGEuZGF0YSRSTkFfc25uX3Jlcy4wLjUpLCBkZWNyZWFzaW5nID0gRkFMU0UpCnNhcHBseShyZXMwNS5saXN0LCAKCQkJIGZ1bmN0aW9uKHgpewoJCQkgCXByaW50KAoJCQkgCQlwYXN0ZSgKCQkJIAkJCSJjbHVzdGVyIiwgeCwgIj0iLCAKCQkJIAkJCW5yb3coY21wLm9iamVjdEBtZXRhLmRhdGFbY21wLm9iamVjdEBtZXRhLmRhdGEkUk5BX3Nubl9yZXMuMC41ID09IHgsXSksIAoJCQkgCQkJImNlbGxzIG9yIiwgCgkJCSAJCQlyb3VuZChucm93KGNtcC5vYmplY3RAbWV0YS5kYXRhW2NtcC5vYmplY3RAbWV0YS5kYXRhJFJOQV9zbm5fcmVzLjAuNSA9PSB4LF0pL3RvdC5jZWxsY291bnQqMTAwLCBkaWdpdHMgPSAyKSwgCgkJCSAJCQkiJSBvZiB0b3RhbCIKCQkJIAkJKQoJCQkgCSkKCQkJIH0KCQkJKQpgYGAKClNvIHdlIGRpZCB0aGUgZGltZW5zaW9uYWwgcmVkdWN0aW9uIGJhc2VkIG9uIHRoZSBiaW9tYXJrIFJOQXMsIHRoZW4gZGlkIG91ciBVTUFQIG5lYXJlc3QgbmVpZ2hib3IgY2x1c3RlcmluZy4KCgpJbiB0aGUgYmlvbWFyayBoaWVyYXJjaGNpYWwgY2x1c3RlcmluZyBhbmFseXNpcyBJIGFzc2F5ZWQgMTY3IGNlbGxzLiBUaGUgc21hbGxlc3QgY2x1c3RlciBJIGRldGVjdGVkIGhhZCAzIGNlbGxzLCBvciAxLjglIG9mIHRvdGFsLCBhbmQgdGhpcyBpcyBhbiB1bmNvbWZvcnRhYmx5IHNtYWxsIG51bWJlciBvZiBjZWxscy4gQmFzZWQgb24gdGhlIFVNQVAgY2FsY3VsYXRpb25zIEkgd291bGQgdGhlcmVmb3JlIGV4cGVjdCB0byBmaW5kIDExIG9yIDEyIG9mIHRoZSBwcmVkaWN0ZWQgMTUgY2x1c3RlcnMuIEkgZm91bmQgMTIsIGFuZCBJIGRvbid0IHJlYWxseSBsaWtlIHRoYXQgbGFzdCBvbmUsIHNvIDExIG9yIDEyLiBTaW5jZSBJIGRpZCB0aGUgaGllcmFyY2hjaWFsIGNsdXN0ZXJpbmcgeWVzdGVyZGF5IGFuZCBkaWQgdGhpcyBtYXRoIHRvZGF5LCB3ZSBjYW4gc2F5IGl0IHdhcyBpbmRlcGVuZGVudCBvZiB0aGVzZSByZXN1bHRzIGFuZCB0aGVyZWZvcmUgdG90YWxseSBsZWdpdC4gWWF5ISEKCg==